[英]How can I use correctly Android Fragments in DrawerLayout?
https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer I was trying to build a Drawer in my project and it went okay (image-wise) , but I can't travel between activities. https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer我试图在我的项目中构建一个 Drawer 并且一切顺利(图像方面) ,但我无法在活动之间旅行。 When I try to click on the drawer menu item, my app crashes.
当我尝试单击抽屉菜单项时,我的应用程序崩溃了。
I checked StackOverflow for an hour and couldn't find a solution.我检查了一个小时的 StackOverflow 并找不到解决方案。
My Console Log:我的控制台日志:
W/System.err: java.lang.ClassCastException: com.example.ali.bitirmeprojesi.DiyetListele cannot be cast to android.support.v4.app.Fragment
at com.example.ali.bitirmeprojesi.WelcomePage.selectDrawerItem(WelcomePage.java:115)
at com.example.ali.bitirmeprojesi.WelcomePage$1.onNavigationItemSelected(WelcomePage.java:91)
at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:170)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)W/System.err: at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:352)
at android.view.View.performClick(View.java:6266)
at android.view.View$PerformClick.run(View.java:24730)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6699)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:246)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)D/AndroidRuntime: Shutting down VME/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ali.bitirmeprojesi, PID: 11292
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:396)
at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:444)
at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:434)
at com.example.ali.bitirmeprojesi.WelcomePage.selectDrawerItem(WelcomePage.java:122)
at com.example.ali.bitirmeprojesi.WelcomePage$1.onNavigationItemSelected(WelcomePage.java:91)
at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:170)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:840)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:352)
at android.view.View.performClick(View.java:6266)
at android.view.View$PerformClick.run(View.java:24730)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:171)
at android.app.ActivityThread.main(ActivityThread.java:6699)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:246)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
My Code which fails:我失败的代码:
public void selectDrawerItem(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.adımsayar:
fragmentClass = StepCounter.class;
break;
case R.id.diyetliste:
fragmentClass = DiyetListele.class;
break;
case R.id.diyetoner:
fragmentClass = DiyetOner.class;
break;
default:
fragmentClass = StepCounter.class;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
// Highlight the selected item has been done by NavigationView
menuItem.setChecked(true);
// Set action bar title
setTitle(menuItem.getTitle());
// Close the navigation drawer
mDrawer.closeDrawers();
}
I am trying to use frags(menu items) like an Intent and I want to use the drawer layout in all activities because frags are better as I researched.我正在尝试像 Intent 一样使用 Frags(菜单项),并且我想在所有活动中使用抽屉布局,因为我研究过的 Frags 更好。 But it fails for some reason.
但由于某种原因它失败了。
try not to use "fragmentClass" to instantiate fragment, instead use fragment = new FragmentName(). your code will look like this below:
Fragment fragment = null;
//Class fragmentClass;
switch(menuItem.getItemId()) {
case R.id.adımsayar:
fragment= new StepCounterFragment();
break;
case R.id.diyetliste:
fragment= new DiyetListeleFragment();
break;
case R.id.diyetoner:
fragment = new DiyetOnerFragment();
break;
default:
fragment = new StepCounterFragment();
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
// Highlight the selected item has been done by NavigationView
menuItem.setChecked(true);
// Set action bar title
setTitle(menuItem.getTitle());
// Close the navigation drawer
mDrawer.closeDrawers();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.