这是Android Fragments和NavigationDrawer的正确用法吗?

mom*_*omo 5 android android-fragments android-actionbar navigation-drawer

虽然我多年来一直在使用Android,但这是我第一次Fragments在现实生活中使用它.所以我有点困惑:-P

这个应用程序有NavigationDrawer4个主要部分.我只使用一个Activity带有我替换Layout的内容的View主要部分Fragments.当选择了一个选项时NavigationDrawer,我实例化a Fragment并将其放入该内容中View.我正在做这样的事情:

    private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        selectItem(position);
    }
}

public static int drawerSelectedOption = 0;
private void selectItem(int position) {
    drawerSelectedOption = position;
    Fragment fragment = null;
    switch (position) {
        case 0:
            fragment = new StoresFragment();
            break;
        case 1:
            //promos
        case 2:
            fragment = new TransactionsFragment();
            break;
        case 3:
            break;
        case 4:
            fragment = new Settings();
            break;
    }

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();

    // update selected item and title, then close the drawer
    mDrawerList.setItemChecked(position, true);
    setTitle(mSectionTitles[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}
Run Code Online (Sandbox Code Playgroud)

更多Fragments是从每个主要内部推出NavigationDrawer Fragments.因此,每个主要的"屏幕"都有几个子屏幕,如下图所示.

Drawer __ Fragment 1.0  -- Fragment 1.1 -- Fragment 1.2
      |__ Fragment 2.0  -- Fragment 2.1 -- Fragment 2.2
Run Code Online (Sandbox Code Playgroud)

我正在推动Fragments以前Fragment ActionBar菜单中的内部,如下所示:

FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        OrderCreateFragment fragment = new OrderCreateFragment();
        fragmentTransaction.add(R.id.content_frame, fragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

我面临几个问题,这就是为什么我正在寻找关于这种方法的一些建议:

  1. 我甚至不知道如何正确管理ActionBar菜单项.每个Fragment都有自己的菜单,有时它们会卡在栏中(即,如果Fragments通过点击NavigationDrawer而不是使用Android后退键返回)
  2. StackBack选择其中一个NavigationDrawer选项时应该完全弹出.我怀疑我的ActionBar杂乱物品与此有关,因为它Fragments以某种方式保存在堆栈中.

所以,任何人都可以请您指教,这是否是正确的做法,以及如何解决与这些问题StackBackActionBar

更新:看起来像清除selectItem方法上的整个堆栈解决了2个主要问题.虽然我仍然有兴趣听取有关这种方法的意见.

Abh*_*bhi 0

嗯,我认为最好的方法取决于应用程序的需求。考虑2种情况

A-应用程序需要导航抽屉和具有嵌套/深度导航的多个活动。那么最好的方法是有一个具有框架布局和导航抽屉的基本活动。所有活动都从该基础活动扩展/继承。对于每个活动,膨胀各自的布局并以编程方式添加到 baseActivity 的框架布局容器中。
返回堆栈导航更容易。

B - 应用程序需要导航抽屉且只有单层导航。然后,我们可以使用在具有导航抽屉的单个活动上动态添加和替换片段的概念。