使用其中使用多个片段的应用程序 下面的代码来获取片段的选定位置。
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()'在null对象引用。
使用以下代码替换片段
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 :(得分:1)
引自Document
替换添加到容器的现有片段。这是 与当前所有人调用remove(Fragment)基本相同 添加了使用相同containerViewId添加的片段 add(int,Fragment,String)与此处给出的参数相同。
替换Fragment
将从后台完全删除它。因此,如果您尝试在事务之后检索Tag
到其他Fragment
,那么它将无法使用。您应该使用Fragment
添加到后台堆栈
addToBackStack(tagName)
。
答案 1 :(得分:0)
从崩溃日志中,似乎这不是您遇到崩溃的行号。崩溃是由于从null片段调用getTag()。也许在此方法返回null之后,您正在使用该片段实例,该实例提供空指针异常。
BaseFragment fragment = (BaseFragment) fragmentManager.findFragmentByTag(tag);
if(fragment != null){
return fragment.
}
return null;
将调试点放在fragment != null
可能会澄清您的问题。
更新
更新代码后,不应再获取任何空指针。但你应该把一个日志检查它是否变为空。
答案 2 :(得分:0)
对于上述问题,如上所述,Fragment将为空。
所以,
BaseFragment frag = getSelectedFragment(fragmentManager);
if(frag == null) return true;
BaseController fragmentController = frag.getController();
通过检查空引用来解决问题。