Android ChildFragmentManager(). FindFragmentById() всегда нулевой

Я наткнулся на сумасшедшего маленького "жучка", или я просто делаю что-то не так. Я пытаюсь получить ссылку на фрагмент, который находится внутри фрагмента. Итак, мы имеем ParentFragmentэто дитя MainActivity, Я могу получить ссылку на этот ParentFragment без проблем, потому что ParentFragment добавляется в MainActivity через код:

ParentFragment fragment = new ParentFragment();

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.fragmentPlaceholder, fragment);
transaction.commit();

Я добавил ChildFragment к ParentFragment через XML вот так:

parent_fragment.xml

<RelativeLayout ... etc>
    .. some other views, findViewById('') works great on these.
    <fragment
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:id="@+id/childFragment1"
        android:tag="1"
        class="com.my.package.ChildFragment"
        android:name="com.my.package.ChildFragment"
        tools:layout="@layout/child_fragment" />
</RelativeLayout>

Все работает нормально, ChildFragment(ы) отображаются в ParentFragment. Единственное, что есть; Я не могу найти фрагмент ById.

Я пробовал несколько способов достижения этого, как это должно быть сделано (?):

getChildFragmentManager().findFragmentById(R.id.childFragment1)

Не сработало Кроме того, получение Activity и использование этого менеджера фрагментов не работает (.. конечно).

Я также попытался получить все фрагменты в ChildFragmentManager, перебрать их и т. Д. Но это всегда возвращает нуль:

getChildFragmentManager().getFragments()

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

Спасибо!

2 ответа

Решение

Если вы хотите использовать вложенные фрагменты и иметь возможность получить ссылку на них через findFragmentById, вы не можете использовать пакет поддержки.

Я изменил все getSupportFragmentManager()к getFragmentManager() и заменил все FragmentActivityс регулярными Activity"S.

Теперь все работает как положено, просто позвоните getChildFragmentManager().findFragmentById(),

Вы должны добавить свой дочерний фрагмент динамически. Смотрите здесь:

Примечание. Вы не можете раздувать макет на фрагмент, если этот макет содержит <фрагмент>. Вложенные фрагменты поддерживаются только при динамическом добавлении к фрагменту.

пс. если вы планируете использовать вложенные фрагменты, то будьте готовы к различным странным поведениям, вы можете найти их в отчетах об ошибках на платформе Android:

https://code.google.com/p/android/issues/list?can=2&q=nested+fragment&sort=-opened&colspec=ID+Status+Priority+Owner+Summary+Stars+Reporter+Opened&cells=tiles

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