简体   繁体   English

如何在 DrawerLayout 中正确使用 Android Fragments?

[英]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.

相关问题 当我使用提供Android Studio的活动抽屉导航模板时,如何使用片段在Drawerlayout上打开项目? - How can I use Fragments to open items on a Drawerlayout, when i used the Activity Drawer Navigation Template that provides android studio? 如何在Android DrawerLayout上请求DistiTouchEvents - How can I requestDisallowTouchEvents on Android DrawerLayout Android,DrawerLayout + Fragments + CollapsingToolbarLayout - Android, DrawerLayout + Fragments + CollapsingToolbarLayout 如何正确使用片段 - How to use fragments correctly 如何在不使用片段的情况下在多种类型的活动上获得相同的抽屉布局? - How can I get the same drawerLayout on multiple types of activities without using fragments? 如何在Android Fragments中使用TakuSemba的MultiSnapRecyclerView? - How can I use MultiSnapRecyclerView by TakuSemba in Android Fragments? 如何使用Firestore在片段中使用RecyclerView-Android - How can I use RecyclerView in fragments using Firestore - Android 如何在外面触摸时关闭android DrawerLayout? - How can I close an android DrawerLayout when touched outside of it? 我如何在android studio上看到xml Drawerlayout文件 - How can i see the xml Drawerlayout file on android studio 我如何在android studio中看到xml DrawerLayout文件 - How can I see the xml DrawerLayout file in android studio
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM