2012-05-31 4 views
49

я определяю идентификатор для моего фрагмента макета XML:findFragmentById всегда возвращает нуль

<?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(); 

Это все работает хорошо. Замена фрагментов и также работает.

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

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

+0

Try' (MyFragment) getFragmentManager(). FindFragmentById (R.id.container); ' – offset

ответ

37

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

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

+15

Это допустимое обходное решение, но не ответило на вопрос. Посмотрите на документы для правильного описания. Документы говорят, что идентификатор присваивается при раздувании фрагмента из xml или является идентификатором контейнера при добавлении с помощью транзакции ... http://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById(int) – speedynomads

+0

См. Этот ответ для хорошего описания при программном назначении идентификаторов: http://stackoverflow.com/a/13241629/857681 – speedynomads

+5

Если фрагмент добавлен без идентификатора, вы не можете найти его, используя идентификатор контейнера. помещен? Я почти уверен, что это дело. –

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

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

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

Итак, что мне нужно изменить? Я не могу определить свой макет с как верхний узел. Я не могу добавить фрагменты в макете xml активности, так как я должен удалить их позже. – Viper

+1

см. Edit ... – Blackbelt

+0

Ок, как вы не можете определить фрагмент в макете. Если вам нужно извлечь linerarlayout, вы должны использовать параметр inflater в onCreateView – Blackbelt

1

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

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

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

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

Работал для меня! –

-1

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

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

3

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

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

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

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

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

Смежные вопросы