Android 片段的GetTag返回空对象引用
使用使用多个片段的应用程序,并且 下面的代码获取片段的选定位置Android 片段的GetTag返回空对象引用,android,android-fragments,nullpointerexception,fragment,fragmentmanager,Android,Android Fragments,Nullpointerexception,Fragment,Fragmentmanager,使用使用多个片段的应用程序,并且 下面的代码获取片段的选定位置 private BaseFragment getSelectedFragment(FragmentManager fragmentManager) { int item = getModel().getSelectedItem();//0th position last String tag = String.valueOf(item); BaseFragment fragme
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.Stringxxx.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();
}
}
那么真正的问题是什么原因呢?深入研究这个代码。
任何帮助都非常感激。
提前感谢从您的崩溃日志中,这似乎不是您获得崩溃的行号。崩溃是由于从空片段调用getTag()造成的。可能在这个方法返回null之后,您使用的是给出null指针异常的片段实例
BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(tag);
if(fragment != null){
return fragment.
}
return null;
可能将调试点放在片段!=null
可能会澄清您的问题
更新
在代码更新之后,您不应该再获得任何空指针。但是你应该放一个日志来检查它是否为空 引用
替换添加到容器中的现有片段。这是
本质上与当前为所有对象调用remove(Fragment)相同
添加了使用相同ContainerWebID添加的片段,然后
使用此处给出的相同参数添加(int、Fragment、String)
替换片段
会将其从后堆栈中完全移除。因此,如果您试图在事务处理后将标记
检索到其他片段
,那么它将不可用。您应该使用
addToBackStack(标记名)
对于上述问题,如上所述,片段为空
所以
通过检查空引用解决了此问题。在替换片段时,您是否为片段提供了“标记”?@SurenderKumar:是的,在替换片段时验证了标记,用片段替换代码更新了答案。您可以从调用此方法的位置添加代码吗。因为可能是碎片管理器即将为空。请尝试检查您在替换时设置为碎片的标记与使用日志查找碎片时的标记相同。试试这个。@SurenderKumar:在这一行BaseFragment Fragment=(BaseFragment)fragmentManager.findFragmentByTag(tag);bpr10:我在行号显示的地方添加了一条注释,并将尝试进行调试,但这个问题的实际原因是什么?我在这行下面添加了一个日志,BaseFragment=(BaseFragment)fragmentManager.findFragmentByTag(tag);最后一个fragment.getTag显示第0个位置,应用程序死机了!!!!你能更新你问题中的完整代码吗?从你的日志可以清楚地看出,你是在从一个空片段调用一个方法。在onbackpressed()中,您调用了getSelectedFragment(fragmentManager).getController(),但没有检查getSelectedFragment()是否为null。试着在backpressed上放一个空的签入。对于上面的问题,我得到了一个空的片段,Checked@bpr10谢谢你的建议。您提到的问题的深度。在提交之前添加addTobackstack(标记)解决了
BaseFragment frag = getSelectedFragment(fragmentManager);
if(frag == null) return true;
BaseController fragmentController = frag.getController();