1

使用一个应用程序,其中使用多个片段,并使用 以下代码来获取片段的选定位置。片段GetTag返回空对象参考

private BaseFragment getSelectedFragment(FragmentManager fragmentManager) 
    { 
     int item = getModel().getSelectedItem();//0th position last 
     String tag = String.valueOf(item); 
     BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(tag); //error shown at this line 
     return fragment; 
    } 

并调用上述方法从

public boolean onBackPressed() 
{ 
    FragmentManager fragmentManager = activity.getFragmentManager(); 
    BaseController fragmentController =    getSelectedFragment(fragmentManager).getController(); 
} 

和坠毁由于下列错误

显示java.lang.NullPointerException:尝试调用虚拟方法“java.lang.String中xxx.android .fwk.app.fragment.BaseFragment.getTag()'在空对象引用上。

通过使用下面的代码

private void displaySelectedFragment() 
    { 

     FragmentManager fragmentManager = getFragmentManager(); 
     if (fragmentManager.getBackStackEntryCount() > 0) { 
      // pop any inner fragments that have been added. 
      fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     } 

     // get the selected item position 
     int selectedItem = model.getSelectedDrawerItem().getItemId(); 

     String tag = String.valueOf(selectedItem); 
     Bundle extras = model.getExtras(); 

     BaseFragment newFragment = NomadFragmentManager.getInstance().getFragment(selectedItem, extras); 
     if (newFragment != null) { 
      FragmentTransaction ft = fragmentManager.beginTransaction(); 
      ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
      ft.replace(R.id.container, newFragment, tag); 
      ft.commit(); 
     } 
    } 

有啥实际问题的原因更换一个片段?挖掘到这个代码。 任何帮助很appriciated。 在此先感谢

+0

虽然替换片段,你正在给一个'标签'片段或不? –

+0

@SurenderKumar:是的,在替换片段时证明标签,用片段替换代码更新答案。 – Swift

+0

您可以从调用此方法的位置添加代码。因为可能是片段管理器即将空。 –

回答

1

Document

报价替换被添加到容器中的现有片段。这是 基本上与为所有当前所有 调用remove(Fragment)相同的containerViewId添加片段,然后使用此处给定的相同参数add(int,Fragment,String)添加片段相同。

替换Fragment将完全将其从堆栈中删除。因此,如果您在与其他Fragment交易后尝试检索Tag,那么它将不可用。您应该使用 addToBackStack(tagName)Fragment添加到背堆栈。

+0

感谢您的建议。你提到的问题的深度。 – Swift

+0

在提交前添加addTobackstack(标签)解决了 – Swift

+0

的问题,欢迎大家使用。很高兴知道它有帮助 –

0

从您的崩溃日志,它似乎这不是你遇到崩溃的行号。崩溃是由于从空片段调用getTag()所致。也许在这个方法返回null之后,你正在使用那个给出空指针异常的片段实例。

BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(tag); 
if(fragment != null){ 
    return fragment. 
} 
return null; 

也许把调试点放在fragment != null可能会说明您的问题。

UPDATE

代码更新后,你不应该再获得任何空指针。但你应该写一个日志来检查它是否为空。

+0

bpr10:我在行号显示的地方添加了一个注释,并尝试进行调试,但是这个问题的实际原因是什么? – Swift

+0

我在这行下面添加了一条日志,BaseFragment fragment =(BaseFragment)fragmentManager.findFragmentByTag(tag);最后fragment.getTag显示第0位,应用程序崩溃!!!! – Swift

+0

您可以请更新您的问题中的完整代码。 – bpr10

0

对于上述问题,如上所述,片段即将为空。

所以,

BaseFragment frag = getSelectedFragment(fragmentManager); 
if(frag == null) return true; 
BaseController fragmentController = frag.getController(); 

通过把的空引用检查解决了这个问题。