GetTag of Fragment返回null对象引用

时间:2016-05-20 06:39:33

标签: android android-fragments nullpointerexception fragment fragmentmanager

使用其中使用多个片段的应用程序 下面的代码来获取片段的选定位置。

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。 提前致谢

3 个答案:

答案 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();

通过检查空引用来解决问题。