2015-01-14 5 views
1

Я пытаюсь обновить свой интерфейс, получив текущий фрагмент в моем контейнере и вызывая его метод. Моя раскладка выглядит следующим образом:getSupportFragmentManager(). FindFragmentByTag() возвращает null

<?xml version="1.0" encoding="UTF-8"?> 
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/frmContentFrame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" /> 
    <!-- The navigation drawer --> 
    <ListView android:id="@+id/lstLeftDrawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:background="@color/SlideMenuBlue" 
     android:divider="@color/White" 
     android:dividerHeight="1dp" 
     android:paddingTop="@dimen/list_padding" 
     android:paddingBottom="@dimen/list_padding"/> 
</android.support.v4.widget.DrawerLayout> 

Я переходящий между осколками (android.support.v4.app) как так

//Switches views 
public void switchContent(final Fragment fragment) { 
    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(R.id.frmContentFrame, fragment, "CURRENT_FRAGMENT") 
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
    .addToBackStack(null) 
    .commitAllowingStateLoss(); 
} 

И когда я называю обновление метода UI моего фрагментом является недействительным. Вот код

public void updateUI() { 
    Fragment fragment = getSupportFragmentManager().findFragmentByTag("CURRENT_FRAGMENT"); 
    System.out.println(fragment); 

    if((FragmentA) getSupportFragmentManager().findFragmentByTag("CURRENT_FRAGMENT") != null){ 
     FragmentA frag = (FragmentA) getSupportFragmentManager().findFragmentByTag("CURRENT_FRAGMENT"); 
     frag.updateUIStatusA(); 
    } 
    else if((FragmentB) getSupportFragmentManager().findFragmentByTag("CURRENT_FRAGMENT") != null){ 
     FragmentB frag = (FragmentB) getSupportFragmentManager().findFragmentByTag("CURRENT_FRAGMENT"); 
     frag.updateUIStatusB(); 
    } 
} 

Странная вещь, в то время как фрагмент возвращается нуль я получаю ClassCastException вроде следующего

java.lang.ClassCastException: com.example.activity.fragments.FragmentB cannot be cast to com.example.activity.fragments.FragmentA 

Почему это, что она знает, что в сообщении об ошибке, что фрагмент я имею в мой контейнер, но возвращает null, когда я пытаюсь его восстановить?

Любая помощь будет большим

Благодаря

+2

вы получите CCE, потому что фрагмент в CURRENT_FRAGMENT может быть А или B. Вы должны получить фрагмент, а затем проверить, если это конкретный «экземпляр» чего-то перед тем, как вы произнесите. –

+2

для нулевого значения, помните, что транзакции фрагментов являются асинхронными. поэтому после вызова 'commit()' вам не гарантируется, что последующий фрагмент find вернет фрагмент. –

+0

@JeffreyBlattman благодарит вас за ввод. Я изменил это, и он отлично поработал. спасибо – BigT

ответ

0

Попробуйте использовать уникальные теги и не забудьте добавить тег в backstack. Пример:

//Switches views 
public void switchContent(final Fragment fragment) { 
    getSupportFragmentManager() 
    .beginTransaction() 
    .replace(R.id.frmContentFrame, fragment, fragment.getClass().getSimpleName()) 
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
    .addToBackStack(fragment.getClass().getSimpleName()) 
    .commitAllowingStateLoss(); 
} 

Тогда ваш метод обновления может выглядеть следующим образом

public void updateUI() { 
Fragment fragmentA = getSupportFragmentManager().findFragmentByTag(FragmentA.class.getSimpleName()); 
Fragment fragmentB = getSupportFragmentManager().findFragmentByTag(FragmentB.class.getSimpleName()); 

if (fragmentA != null) 
    fragmentA.updateUIstatusA(); 

if (fragmentB != null) 
    fragmentB.updateUIstatusB(); 

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