findFragmentById всегда возвращает null
Я определяю идентификатор для моего фрагмента в 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. Всегда.
когда я пытаюсь сделать то же самое с тегами вместо идентификаторов Я могу получить фрагмент по его тегу без каких-либо проблем:
MyFragment myFragment = new MyFragment();
fragmentTransaction.add(R.id.fragment_container, myFragment, "testfragment");
fragmentTransaction.commit();
...
MyFragment myFragment = (MyFragment) getFragmentManager().findFragmentByTag("testfragment");
почему findFragmentById не может найти фрагмент, но findFragmentByTag делает это? Я что-то упустил?
8 ответов:
R.id.test_fragmentЭто не идентификатор вашего фрагмента, а идентификатор вашего LinearLayoutвызов
add(int containerViewId, Fragment fragment)добавить фрагмент без тега. Так или вы используетеadd(int containerViewId, Fragment fragment, String tag)и вы возвращаете свой фрагмент, используя свой тег (как идентификатор)
использовать
<FrameLayout>тег-контейнер в файл layout. Позже, чтобы заменить фрагменты из вашей деятельности динамически, вы можете использовать идентификатор<FrameLayout>контейнер для замены фрагментов в вашей деятельности.<FrameLayout android:id="@+id/test_fragment" android:layout_width="match_parent" android:layout_height="match_parent" />
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/test_fragment"должно быть
fragmentНе aLinearLayout<fragment android:name="com.example.yourfragment" android:id="@+id/test_fragment" android:layout_width="match_parent" android:layout_height="match_parent" />
Я был с помощью
android.support.v4.app.Fragmentв моем макете при вызовеgetFragmentManager()что на самом деле искалandroid.app.Fragmentподклассы и я получилnull. Так что исправление было позвонить .В общем убедитесь, что пакет из фрагмент вы подклассы и использование в макете такой же возвращаются тегом
FragmentManager, который осуществляет поиск.
R.id.test_fragmentвашLinearLayoutID не ваш фрагмент.вы можете определить и идентификатор на фрагменте, когда он раздувается из xml, как в этом примере http://developer.android.com/guide/topics/fundamentals/fragments.html#Adding
или, вы должны вместо этого использовать :
(MyFragment) getFragmentManager().findFragmentById(R.id.fragment_container);
FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.containerb); if(fragmentB != null) { fragmentB.showuserResponse(msg); }использовать идентификатор контейнера в качестве идентификатора фрагмента. А затем проверьте наличие нулевой ссылки.
fragmentTransaction. add (R. id. fragment_container, myFragment);
MyFragment myFragment = (MyFragment) getFragmentManager (). findFragmentById(R. id. test_fragment);
Пожалуйста, обратите внимание на разницу.
- вы должны пройти ИД Р..fragment_container в качестве аргумента
findFragmentById, когда вы передаете его в функцию add, вместоR.id.test_fragmentкстати, согласно внутренней реализации двух функций, он должен будьте правы, что идентификатор может быть это его представление контейнера.
Comments