2016-04-04 3 views
1

Я хочу вызвать метод фрагмента из его родительской активности. Для этого я хочу объект фрагмента.findFragmentByTag возвращает null в android

родительская активность имеют фрагмент в framelayout так:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/bottom_buttons" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 

Это код для получения объекта фрагмента.

FragmentBottomButtons fragment = new FragmentBottomButtons(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.bottom_buttons, fragment,"FragmentTag"); 
     //ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     //ft.addToBackStack(""); 
     ft.commit(); 


     /* 
     getSupportFragmentManager() 
       .beginTransaction() 
       .add(R.id.bottom_buttons, new FragmentBottomButtons()) 
       .commit(); 

     */ 
     frag = (FragmentBottomButtons) getSupportFragmentManager().findFragmentByTag("FragmentTag"); 
     //fragmentBottomButtons = (FrameLayout)findViewById(R.id.bottom_buttons); 
     if (frag == null){ 
      Utility.displayToast("fragmnt is null"); 
     } 

Но он возвращает null.

Может ли кто-нибудь помочь мне в этом? что здесь не так?

+1

Попробуйте выполнить fragmentManager.executePendingTransactions(); перед тем как получить фрагмент, посмотрите, работает ли это. commit() работает асинхронно и его можно вызвать, прежде чем действие будет полностью завершено. – aminner

ответ

5

Когда вы используете метод commit(), никто не дает вам гарантировать, что ваш фрагмент будет прикреплен к FragmentManager «на лету».

Это происходит из-за внутренней логики FragmentManager: при добавлении \ replace \ remove любых фрагментов вы создаете FragmentTransaction и помещаете его в очередь выполнения внутри FragmentManager. Фактически все транзакции ждут, пока FragmentManager не запустит задачи.

Чтобы избежать этой ситуации, вы можете заставить Ставить каждую задачу под фрагментом с помощью

getSupportFragmentManager().executePendingTranscation(); 

Этого метод начинает незавершенные транзакции и сделать более жестким уверена для использования findFragmentById() метода.

Итак, наконец, вам нужно:

CustomFragment fragment = new CustomFragment(); 
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
//add or replace or remove fragment 
ft.commit(); 

getSupportFragmentManager().executePendingTranscation(); 

CustomFragment customFragment = (CustomFragment) getSupportFragmentManager().findFragmentByTag("FragmentTag"); 
0

Ваш Fragment еще не установлен. Вы должны позвонить по телефону findFragmentByTag(). Вы можете, например, добавить слушателя к вам Fragment и позвонить по телефону Activity по методу onAttach(), чтобы сообщить Activity, что ваш Fragment создан.

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