使用`Fragments`在{AppCompatActivity`中导航

时间:2015-09-02 13:24:31

标签: android android-fragments navigation

我正在尝试在我的应用程序中设置正确的导航,这取代了主要内容区域中的Fragment,因此我只有一个Activity。我有一个主Fragment和几个子Fragments,例如Fragment的首选项。使用后退按钮时一切正常,但我想实现包括图标在内的向上导航。我使用ActionBar获取的Activity.getSupportActionBar()以及来自appcompat的ToolbarActionBarDrawerToggle

我在首先设置Drawer时跟踪了this tutorial

当前行为: 当我启动应用程序时,列表/抽屉图标显示在ActionBar的左侧部分。点击此按钮后,Drawer会打开,我可以选择项目。子Fragment被替换为我的内容,后退按钮弹出堆栈,让我回到之前的Fragment

缺少行为 左上角的列表/抽屉图标永远不会被后退箭头图标取代,我无法弄清楚如何正确实现这一点。单击列表/抽屉图标时,Drawer 总是拉出来,无论我在哪Fragment

我尝试了什么:

  1. 我尝试了this回答。它有点工作,这意味着后箭头图标设置在子Fragment中,但单击后退箭头仍会打开Drawer而不是提供导航。此外,当使用后退按钮“向上”时,列表/抽屉图标将被替换为任何内容。
  2. 我也尝试过this回答。此处,所需的ActionBar行为/外观在各种onCreate()的{​​{1}}方法中实现。使用此功能,我可以向上箭头,但单击箭头时仍然会拉Fragment
  3. 各种其他小事和黑客。
  4. 我的问题:

    1. 我的代码有什么问题?
    2. 使用组合DrawerActionBarToolbar与导航一起实施ActionBarDrawerToggle导航是正确/正常吗?
    3. MyActivity.onCreate():

      Drawer

      DrawerFragment类

      @Override
      protected void onCreate(Bundle savedInstanceState)
      {
          // Other stuff
      
          // Setup drawer.
          mDrawerFragment = (DrawerFragment)
                  getSupportFragmentManager().findFragmentById(R.id.mm_navigation_drawer);
          mDrawerFragment.initialize(this, (DrawerLayout)findViewById(R.id.mm_drawer_layout), toolbar);
      }
      

      MyActivity.onDrawerItemSelected()

      接口public class DrawerFragment extends Fragment { private MyActivity mMyActivity; private MyActionBarDrawerToggle mMyBarDrawerToggle; private DrawerLayout mDrawerLayout; private FragmentDrawerListener mFragmentDrawerListener; private View mContainerView; public void initialize(MyActivity myActivity, final DrawerLayout drawerLayout, final Toolbar toolbar) { mMyActivity = myActivity; mFragmentDrawerListener = mMyActivity; mContainerView = myActivity.findViewById(R.id.mm_navigation_drawer); mMyActionBarDrawerToggle = new MyActionBarDrawerToggle(myActivity, drawerLayout, toolbar, R.string.mm_drawer_open, R.string.mm_drawer_close); mDrawerLayout = drawerLayout; mDrawerLayout.setDrawerListener(mMyActionBarDrawerToggle); mDrawerLayout.post(new Runnable() { @Override public void run() { mMyActionBarDrawerToggle.syncState(); } }); } @Nullable @Override public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { // Not relevant, just create and return the View. } } 的实现是在FragmentDrawerListener类中完成的。它只是使用MyActivity s。

      将内容区域替换为其他Fragment
      FragmentTransaction

      MyActionBarDrawerToggle类

      @Override
      public void onDrawerItemSelected(View view, int postion)
      {
          switch (postion)
          {
              case DrawerAdapter.ITEM_FILTERED_RECIPES:
                  showFilteredRecipesFragment();
                  break;
      
              case DrawerAdapter.ITEM_SELECTED_RECIPES:
                  showSelectedRecipesFragment();
                  break;
      
              case DrawerAdapter.ITEM_SHOPPING_LIST:
                  showShoppingListFragment();
                  break;
      
              case DrawerAdapter.ITEM_SETTINGS:
                  showSettingsFragment();
                  break;
      
              case DrawerAdapter.ITEM_ABOUT:
                  showAboutFragment();
                  break;
          }
      }
      

      使用一个简单的静态public class MyActionBarDrawerToggle extends ActionBarDrawerToggle { private MyActivity mMyActivity; private Toolbar mToolbar; public MyActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes); mMyActivity = (MyActivity) activity; mToolbar = toolbar; } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); mMyActivity.invalidateOptionsMenu(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); mMyActivity.invalidateOptionsMenu(); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); mToolbar.setAlpha(1 - slideOffset / 2); } } 实例在主布局中对DrawerFragment进行了充气:

      Fragment

1 个答案:

答案 0 :(得分:1)

如果您正在为您的应用程序使用材料设计,那么您应该使用Toolbar替换活动中的Actionbar。您仍将保留ActionBarDrawerToggle,功能将保持不变。

至于你的碎片,只要它们被相同的活动“收纳”(即抽屉的活动),更换碎片就不会导致抽屉切换以改变后箭头。只有在导航到新活动时才会更改。只有这样,主要活动才会被视为家庭活动,其他活动会有后退箭头导航回来