GetTag of Fragment returns 空对象引用

GetTag of Fragment returns the null object reference

使用其中使用了多个片段的应用程序并且 以下代码用于获取片段的选定位置。

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();
        }
    }

所以问题的实际原因是什么?深入研究这段代码。 非常感谢任何帮助。 提前致谢

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

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

也许将调试点放在 fragment != null 可能会澄清您的问题。

UPDATE

你的代码更新后,你应该不会再得到任何空指针了。但是你应该放一个日志来检查它是否变为空。

引用自Document

Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.

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

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

所以,

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

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