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 делает это? Я что-то упустил?

560   8  

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 Не a LinearLayout

<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 ваш LinearLayout ID не ваш фрагмент.

вы можете определить и идентификатор на фрагменте, когда он раздувается из 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

    Ничего не найдено.