我不知道如何使用findViewById(R.id.nav_timetable);
而不返回null并创建NPE。我的目标是默认加载TimetableFragment,然后人们可以使用抽屉导航去到其他片段。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setupDrawer(toolbar);
drawer.openDrawer(GravityCompat.START); // Opened this on first run so they know what's in it.
// TODO Change this later to a home page and remove goToTimetablePage();
// goToTimetablePage();
goToFragmentFromNavMenuItem((MenuItem) findViewById(R.id.nav_timetable));
}
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Handle navigation view item clicks here.
goToFragmentFromNavMenuItem(menuItem);
return true;
}
private void goToFragmentFromNavMenuItem(MenuItem menuItem) {
// Create a new fragment and specify the fragment to show based on nav item clicked
Fragment fragment = null;
Class fragmentClass;
switch (menuItem.getItemId()) {
case R.id.nav_slideshow: // TODO fragmentClass = SlideshowFragment.class; break;
case R.id.nav_share: // TODO fragmentClass = ShareFragment.class; break;
case R.id.nav_timetable:
fragmentClass = TimetableFragment.class;
// goToTimetablePage();
break;
default:
fragmentClass = TimetableFragment.class;
// TODO Change this later to a home page:
// TODO fragmentClass = HomeFragment.class; Remove "goToTimetablePage();"
}
//noinspection TryWithIdenticalCatches
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
menuItem.setChecked(true);
setTitle(menuItem.getTitle());
drawer.closeDrawer(GravityCompat.START);
}
错误信息:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gmail.gogobebe2.thedayahead/com.gmail.gogobebe2.thedayahead.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int android.view.MenuItem.getItemId()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int android.view.MenuItem.getItemId()' on a null object reference
at com.gmail.gogobebe2.thedayahead.MainActivity.goToNavFragment(MainActivity.java:123)
at com.gmail.gogobebe2.thedayahead.MainActivity.onCreate(MainActivity.java:59)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我尝试使用onCreateView
方法,但某些原因导致出现了stackoverflow错误信息。
编辑:这里是所有的代码,以消除任何困惑:https://github.com/gogobebe2/TheDayAhead
编辑2:不要担心goToTimetablePage()
方法。目前没有使用它,我计划将它移到TimetableFragment
片段中。
编辑3:我将方法名称更改为goToFragmentFromNavMenuItem()
,以更好地描述其操作。我还想告诉大家,onNavigationItemSelected(MenuItem menuItem)
方法与 goToFragmentFromNavMenuItem()
方法完美配合使用,只是在onCreate(Bundle savedInstanceState)
中使用时由于findViewById(R.id.nav_timetable)
始终返回null
而无法使用。
另外,这是我制作的第一个Android应用程序,我正在制作中学习。昨晚我甚至不知道什么是片段,所以我真的很新手,请不要假设任何知识。