Фрагменты во вкладке Action Bar фрагменты?

Можете ли вы поместить фрагменты внутри фрагмента для вкладки в панели действий?

У меня есть приложение Android (3.0/Honeycomb) с основным действием, которое имеет панель действий с 3 вкладками. Вкладки добавляются в методе onCreate() моей деятельности, а фрагменты вкладок добавляются / удаляются с помощью TabListener. Код почти идентичен примеру на http://developer.android.com/guide/topics/ui/actionbar.html.

TabListener выглядит так:

public class SwapOutTabListener implements ActionBar.TabListener {
    public SwapOutTabListener(Fragment fragment) {
        _fragment = fragment;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_container, _fragment, null);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(_fragment);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // do nothing
    }

    private Fragment _fragment;
}

Две из моих вкладок - это простые фрагменты, они содержат только один TextView, примерно так (большинство атрибутов удалено для ясности):

<LinearLayout>
    <TextView android:text="Tab 1" />
</LinearLayout>

Но фрагмент для одной из моих вкладок более сложный и содержит два встроенных фрагмента, примерно так:

<LinearLayout>
    <fragment
        android:name="...Fragment_1"
        android:id="@+id/frag1"
    />
    <fragment
        android:name="...Fragment_2"
        android:id="@+id/frag2"
    />
</LinearLayout>

Когда пользователь выбирает вкладку для этого фрагмента, все методы запуска жизненного цикла (onStart(), onResume()) вызываются для всех трех фрагментов (фрагмента вкладки плюс два встроенных фрагмента).

Но когда пользователь затем выбирает другую вкладку, только фрагмент вкладки получает любой из методов окончания жизненного цикла (onPause(), onStop() и т. Д.). Два встроенных фрагмента никогда не получают ни одного из этих вызовов и никогда не закрываются.

Это вызывает проблемы при повторном выборе вкладки, так как среда выполнения жалуется на дубликат идентификатора фрагмента при загрузке фрагмента вкладки:

Binary XML file line #7: Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with another fragment for ...Fragment_1

Я отвечаю за удаление этих встроенных фрагментов при удалении фрагмента вкладки? Если да, то когда именно я это сделаю?

2 ответа

Решение

Нет, фрагменты в настоящее время не находятся в иерархии. Я смотрел на это, но на данный момент все варианты его использования были вызваны главным образом чрезмерным чрезмерным использованием фрагментов, когда каждый отдельный элемент пользовательского интерфейса реализован как фрагмент. Это не то, как они предназначены для использования, они предназначены для инкапсуляции основных частей приложения верхнего уровня. Если у вас есть иерархия вещей, это то, для чего предназначен ваш макет и представления.

Аааа. Чувство реализации. Я только что нашел это: "Примечание. Вы не можете раздувать макет на фрагмент, если этот макет включает в себя. Вложенные фрагменты поддерживаются только при динамическом добавлении к фрагменту".

http://developer.android.com/about/versions/android-4.2.html

Другие вопросы по тегам