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

FindFragmentById всегда возвращает null

Я определяю ID для моего фрагмента в макете xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/test_fragment"
...

Затем я добавляю этот фрагмент в действие onCreate:

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment);
fragmentTransaction.commit();

Все работает нормально. Замена фрагментов и также работает.

Позже я пытаюсь извлечь этот фрагмент по его идентификатору в один из методов активности:

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment);

Это приводит к тому, что myFragment будет null. Всегда.

Когда я пытаюсь сделать то же самое с тегами вместо ID, я могу без проблем получить фрагмент по тегу:

MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment");
fragmentTransaction.commit();

...

MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment");

Почему findFragmentById не может найти фрагмент, но findFragmentByTag делает это? Я что-то пропустил?

4b9b3361

Ответ 1

R.id.test_fragment - это не идентификатор вашего фрагмента, а идентификатор вашего LinearLayout

Вызов add(int containerViewId, Fragment fragment) добавит фрагмент без тега. Итак, или вы используете add(int containerViewId, Fragment fragment, String tag), и вы возвращаете свой фрагмент с помощью своего тега (в качестве идентификатора)

Ответ 2

Используйте тег <FrameLayout> как контейнер в вашем файле макета. Позднее для замены фрагментов из вашей активности динамически вы можете использовать идентификатор контейнера <FrameLayout> для замены фрагментов в своей деятельности.

<FrameLayout
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

Ответ 3

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/test_fragment"

он должен быть fragment не a LinearLayout

<fragment android:name="com.example.yourfragment"
            android:id="@+id/test_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

Ответ 4

Я использовал android.support.v4.app.Fragment в своем макете при вызове getFragmentManager(), который фактически искал подклассы android.app.Fragment, и я получил null. Поэтому исправление заключалось в вызове getSupportFragmentManager().

В общем, убедитесь, что пакет фрагмента, который вы подклассифицируете и используете в вашем макете, тот же, что и соответствующий FragmentManager, который выполняет поиск.

Ответ 6

Или, вы должны использовать вместо этого:

(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container);

Ответ 7

FragmentB fragmentB = 
(FragmentB) getSupportFragmentManager().findFragmentById(R.id.containerb);

if(fragmentB != null)
{
   fragmentB.showuserResponse(msg);
}

Использовать идентификатор контейнера в качестве идентификатора фрагмента. Затем проверьте нулевую ссылку.

Ответ 8

fragmentTransaction.add(R.id.fragment_container, myFragment);

MyFragment myFragment = (MyFragment) getFragmentManager(). findFragmentById (R.id.test_fragment);

Обратите внимание на разницу.

Вам следует передать R.id.fragment_container в качестве аргумента findFragmentById, поскольку вы передаете его функции добавления вместо R.id.test_fragment

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