Фрагменты на вкладке Action Bar фрагменты? - PullRequest
16 голосов
/ 11 марта 2011

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

У меня есть приложение для 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

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

Ответы [ 2 ]

19 голосов
/ 12 марта 2011

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

1 голос
/ 05 января 2013

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

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

...