【问题标题】:android.support.v4.app.Fragment.mFragmentManager' on a null object referenceandroid.support.v4.app.Fragment.mFragmentManager' 在空对象引用上
【发布时间】:2016-04-21 20:26:46
【问题描述】:

我有以下代码行,用于创建导航视图以加载片段和此 android 应用程序。我收到错误:android.support.v4.app.Fragment.mFragmentManager' 在空对象引用上。我已经创建了片段,并且导航视图可以正常工作。

public void selectDrawerItem(MenuItem menuItem){

    Fragment fragment = null;
    Class fragmentClass = null;

    switch(menuItem.getItemId()){
        case R.id.nav_show_all_events_activity:
            fragmentClass = AllEventsFragment.class;
            break;
        case R.id.nav_whats_hot_today_activity:
            fragmentClass = WhatsHotFragment.class;
            break;
    }

    try {
        fragment = (Fragment) fragmentClass.newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();

    menuItem.setChecked(true);
    setTitle(menuItem.getTitle());
    mDrawer.closeDrawers();
}

【问题讨论】:

  • 您创建fragment 的方式有点奇怪。你确定fragment 不为空吗?
  • 是的,你不需要反射来创建你的片段,只需调用fragment = new AllEventsFragment()fragment = new WhatsHotFragment()
  • 我在第一次尝试时尝试过,但失败了 (fragment = new AllEventsFragment())。我确定fragment 不为空。

标签: android android-fragments navigationview


【解决方案1】:

您确定您的菜单中只有 2 个 MenuItems 吗?如果还有更多,你最终会得到一个null 片段。您可以在 switch 语句中添加一个“默认”案例:

switch(menuItem.getItemId()){
    case R.id.nav_show_all_events_activity:
        fragmentClass = AllEventsFragment.class;
        break;
    case R.id.nav_whats_hot_today_activity:
        fragmentClass = WhatsHotFragment.class;
        break;
    default:
        return;
}

这应该确保片段不会为空。

【讨论】:

  • 谢谢您忘记添加return。你还是不行
【解决方案2】:

我分析了代码,想知道为什么以前的方法不起作用。我发现了一个关于我使用的导入的小问题。我在main_activity 中使用了以下import android.support.v4.app.Fragment; 导入。看到我在AllEventsFragmentWhatsHotFragment 类中使用import android.app.Fragment;,其中我将导入更改为import android.support.v4.app.Fragment; 谢谢你的帮助。 最终版本如下:

public void selectDrawerItem(MenuItem menuItem){

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    Fragment fragment;

    switch(menuItem.getItemId()){
        case R.id.nav_show_all_events_activity:
            fragment = new AllEventsFragment();
            break;
        case R.id.nav_whats_hot_today_activity:
            fragment = new WhatsHotFragment();
            break;
        default:
            return;
    }

    transaction.replace(R.id.flContent, fragment);
    transaction.commit();

    menuItem.setChecked(true);
    setTitle(menuItem.getTitle());
    mDrawer.closeDrawers();
}

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 2016-06-12
    • 2015-10-27
    • 2016-08-05
    • 2017-05-29
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多