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 делает это? Я что-то пропустил?
Ответы
Ответ 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
, который выполняет поиск.
Ответ 5
R.id.test_fragment
- ваш идентификатор LinearLayout
, а не ваш фрагмент.
Вы можете определить и id на фрагменте, когда он завышен от xml, как в этом примере http://developer.android.com/guide/topics/fundamentals/fragments.html#Adding
Ответ 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
Кстати, согласно внутренней реализации двух функций, должно быть правильно, что идентификатор может быть
его вид контейнера.