【问题标题】:Navigating between fragment and activities在片段和活动之间导航
【发布时间】:2017-07-26 05:30:53
【问题描述】:

我在片段和活动之间导航时遇到问题,我使用了 Android studios 2.2.3 的自动生成模板并对其进行了自定义以在片段之间导航。

我添加了五个片段并使用了本教程Using Fragments with the Navigation Drawer Activity

片段运行良好,一切都很好,所以我想使用相同的 导航抽屉 进行另一个活动,但它一直在崩溃,我使用 Intent。

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    Fragment fragment = null;
    Class fragmentClass = null;
    if (id == R.id.nav_schedule) {
     fragmentClass = ScheduleFragment.class;
    } else if (id == R.id.nav_assingment) {
        fragmentClass = AssignmentsFragment.class;
    } else if (id == R.id.nav_teachers) {
        fragmentClass = TeachersFragment.class;
    } else if (id == R.id.nav_score) {
        fragmentClass = ScoreFragment.class;
    } else if (id == R.id.nav_events) {
        fragmentClass = EventsFragment.class;
    } else if (id == R.id.nav_setting) {

    }else if (id == R.id.nav_about) {
        Intent intent = new Intent(getApplicationContext(),AboutActivity.class);
        startActivity(intent);
    }else if (id == R.id.nav_logout) {
        Intent i = new Intent(getApplicationContext(),LoginActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(i);
    }
         try {
             try {
                 fragment = (Fragment) fragmentClass.newInstance();
             } catch (InstantiationException e) {
                 e.printStackTrace();
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
             }
             FragmentManager fragmentManager = getSupportFragmentManager();
             fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
         }catch (android.app.Fragment.InstantiationException e){
             e.printStackTrace();
         }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

Logcat

E/AndroidRuntime: 致命异常: main 进程:com.zer0ll.demo.studentapp,PID:31638 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Object java.lang.Class.newInstance()” 在 com.zer0ll.demo.studentapp.Activities.HomeActivity.onNavigationItemSelected(HomeActivity.java:95) 在 android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:156) 在 android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822) 在 android.support.v7.view.menu.SubMenuBuilder.dispatchMenuItemSelected(SubMenuBuilder.java:88) 在 android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:156) 在 android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:969) 在 android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:342) 在 android.view.View.performClick(View.java:5156) 在 android.view.View$PerformClick.run(View.java:20755) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:5835) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 还添加一些编码部分,你在哪里以及得到什么确切的错误?
  • 问题可能是您没有在清单中定义活动。但为了更清楚起见,您需要在此处提供崩溃日志和代码。
  • @Avi 抱歉,我现在就编辑它

标签: android android-fragments android-fragmentactivity navigation-drawer fragmentmanager


【解决方案1】:

您必须在清单中定义活动。

【讨论】:

  • 我的活动运行良好,我不能称它们为导航抽屉,仅此而已。
【解决方案2】:

尝试在清单文件中添加您的活动,

<activity android:name="Packagename.AboutActivity">

        </activity>

    <activity android:name="Packagename.LoginActivity">

        </activity>

【讨论】:

    【解决方案3】:

    使用 Activity Context 不使用 Application Context 启动您的 Activity,并在启动 Activity 后返回 true,并且还使用正确的包名称在清单中声明,如下所示

     public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        Fragment fragment = null;
        Class fragmentClass = null;
        if (id == R.id.nav_schedule) {
            fragmentClass = ScheduleFragment.class;
        } else if (id == R.id.nav_assingment) {
            fragmentClass = AssignmentsFragment.class;
        } else if (id == R.id.nav_teachers) {
            fragmentClass = TeachersFragment.class;
        } else if (id == R.id.nav_score) {
            fragmentClass = ScoreFragment.class;
        } else if (id == R.id.nav_events) {
            fragmentClass = EventsFragment.class;
        } else if (id == R.id.nav_setting) {
    
        }else if (id == R.id.nav_about) {
            Intent intent = new Intent(classname.this,AboutActivity.class);
            startActivity(intent);
            return true;
        }else if (id == R.id.nav_logout) {
            Intent i = new Intent(classname.this,LoginActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(i);
            return true;
        }
        try {
            try {
                fragment = (Fragment) fragmentClass.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
        }catch (android.app.Fragment.InstantiationException e){
            e.printStackTrace();
        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
    

    【讨论】:

    • 抱歉,没有任何改变
    • 当你开始你的活动时返回结果为真,这可能会帮助你喜欢这个 Intent i = new Intent(classname.this,LoginActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);开始活动(一);返回真;我已经在我的回答中进行了更改,请参阅
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多