片段GetTag返回空对象参考
问题描述:
使用一个应用程序,其中使用多个片段,并使用 以下代码来获取片段的选定位置。片段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。 在此先感谢
答
报价替换被添加到容器中的现有片段。这是 基本上与为所有当前所有 调用remove(Fragment)相同的containerViewId添加片段,然后使用此处给定的相同参数add(int,Fragment,String)添加片段相同。
替换Fragment
将完全将其从堆栈中删除。因此,如果您在与其他Fragment
交易后尝试检索Tag
,那么它将不可用。您应该使用 addToBackStack(tagName)
将Fragment
添加到背堆栈。
答
从您的崩溃日志,它似乎这不是你遇到崩溃的行号。崩溃是由于从空片段调用getTag()所致。也许在这个方法返回null之后,你正在使用那个给出空指针异常的片段实例。
BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(tag);
if(fragment != null){
return fragment.
}
return null;
也许把调试点放在fragment != null
可能会说明您的问题。
UPDATE
代码更新后,你不应该再获得任何空指针。但你应该写一个日志来检查它是否为空。
答
对于上述问题,如上所述,片段即将为空。
所以,
BaseFragment frag = getSelectedFragment(fragmentManager);
if(frag == null) return true;
BaseController fragmentController = frag.getController();
通过把的空引用检查解决了这个问题。
虽然替换片段,你正在给一个'标签'片段或不? –
@SurenderKumar:是的,在替换片段时证明标签,用片段替换代码更新答案。 – Swift
您可以从调用此方法的位置添加代码。因为可能是片段管理器即将空。 –