Подтвердить что ты не робот

Два вопроса о шаблоне Master/Detail Flow

Я только что посмотрел шаблон Master/Detail Flow, и я не могу понять 2 вещи.

1) Зачем нужен Android версии 11, когда генерируемый код, похоже, поддерживает поддержку совместимости с фрагментами? В частности, почему вы не можете создавать шаблоны, запускаемые с Android версии 8? (например, этот импорт)

import android.support.v4.app.FragmentActivity;

2) Как основная активность знает, показывать ли детали в новой деятельности или в панели сведений, если она достаточно велика? Кажется, это делается с помощью этого кода:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_item_list);

    if (findViewById(R.id.item_detail_container) != null) {
        mTwoPane = true;
        ((ItemListFragment) getSupportFragmentManager()
                .findFragmentById(R.id.item_list))
                .setActivateOnItemClick(true);
    }
}

setContentView(R.layout.activity_item_list); устанавливает макет в ListFragment, который просто устанавливает свой собственный адаптер, но я не вижу, как findViewById(R.id.item_detail_container) != null когда-либо вернет true, так как он никогда не открывается или раздувается.

Любые подсказки?

4b9b3361

Ответ 1

После долгих поисков ответ из-за этого в values-large/refs.xml

<resources>
    <item type="layout" name="activity_item_list">@layout/activity_item_twopane</item>
</resources>

Он перенаправляет запрос на нормальный макет на более крупный макет (двухпанельная версия), где R.id.item_detail_container определен.

Это довольно запутанно. Я не уверен, почему они просто не назовет большой макет так же, как обычный макет, но затем имеют разные xml.

Ответ 2

Вот что сработало для меня.

1) Добавьте ActionBarSherlock в проект: Project → Properties → Android → Выберите ActionBarSherlock и нажмите кнопку "Добавить". Если у вас нет АБС, вам нужно получить его от http://actionbarsherlock.com/, прежде чем продолжить.

2) "AndroidManifest.xml": установите minSdkVersion на 10 (Gingerbread). Я думаю, вы можете пойти еще ниже этого.

android:minSdkVersion="10"

3) "activity_item_list.xml": просто удалите "list_content", потому что Eclipse продолжает жаловаться, что вам нужен сотовый или более поздний.

tools:layout="@android:layout/list_content"  <-- remove

4) "activity_item_twopane.xml": удалить линии сотового или более позднего.

android:divider="?android:attr/dividerHorizontal"  <-- remove
tools:layout="@android:layout/list_content"        <-- remove

5) ItemListActivity.java: используйте функцию SherlockFragmentActivity.

//public class ItemListActivity extends FragmentActivity implements
public class ItemListActivity extends SherlockFragmentActivity implements

6) ItemListFragment.java: изменение параметров в setListAdapter().

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // TODO: replace with a real list adapter.
        //setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
        //    android.R.layout.simple_list_item_activated_1,
        //    android.R.id.text1, DummyContent.ITEMS));

        int layout = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) ?
            android.R.layout.simple_list_item_activated_1 :
            android.R.layout.simple_list_item_checked;

        setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
            layout, DummyContent.ITEMS));
}

7) "ItemDetailActivity.java": используйте функцию "Шерлок" и "getSupportActionBar" ().

//public class ItemDetailActivity extends FragmentActivity {
public class ItemDetailActivity extends SherlockFragmentActivity {
    ...
    //getActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

После внесения изменений приложение работало в Gingerbread, ICS и Jelly Bean.

__ Золь

Ответ 3

с уважением в вашем первом вопросе:

вам нужно изменить класс ItemListFragment:

setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
                R.layout.simple_list_item_activated_1,
                R.id.text1,
                DummyContent.ITEMS));

для этого:

setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
               R.layout.simple_list_item_1,
               R.id.text1,
               DummyContent.ITEMS));

И прокомментируйте в ItemDetailActivity эту строку:

// getActionBar().setDisplayHomeAsUpEnabled(true);

Ответ 4

Я думаю, что для шаблона Master/Detail Flow требуется уровень api 11, потому что он использует панель действий. Я попытаюсь использовать этот шаблон с ActionBarSherlcock и посмотреть, работает ли он с Android 2.2 или 2.3.

Ответ 5

Что касается первого вопроса, то одной из причин, по которой он требует V11, является то, что он использует list_content и не входит в библиотеку совместимости. Обход для этого здесь.

Ответ 6

Техника, используемая во второй части вашего вопроса, является примером Alias ​​Layout.