Фрагменты в фрагментах вкладки "Панель действий"?

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

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

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

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

Ответ 1

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

Ответ 2

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

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