android - 使用NavigationDrawer

时间:2016-04-02 07:25:24

标签: android android-fragments navigation-drawer master-detail

我尝试使用具有NavigationDrawer的平板电脑和智能手机的不同布局的主/详细视图。

场合

我使用AndroidStudio中的NavigationDrawer模板:从侧面菜单打开的每个页面都作为Frament。它在MainActivity中被替换为一个Frame Layout(称为window_container)。

因此,来自侧边菜单的每个页面都是MainActivity中的片段,而不是独立的Activity 。这让我很头疼。

master \ detail视图有什么问题?

谷歌推荐做类似的事情: enter image description here 我们有两个包含片段的活动。 但我对所有窗口只有一个活动,每个窗口只有一个片段!

我也是这样的: enter image description here 只有一个活动和详细信息视图与主视图重新复制。这离我更近了。

我做了什么?

我使用导航抽屉中的碎片作为主要和细节碎片的base碎片。它就像他们的活动一样:enter image description here

它有一个接口,所以子framgnets可以与它交互,例如 - 调用方法来显示详细视图。

我在Master和Detail视图中引用了我的基本片段:

public void onCreate()
{
   ...
   my_base_fragment = (IMyBaseFragment)getParentFragment.
}

还有一个问题。当我在基础片段中使用getFragmentManager时,getParentFragment会返回null。所以我使用getChildFragmentManager并且没关系。

所以,我对片段的工作看起来像这样:

  1. 对于Master \ Detail视图片段更改我使用基本片段
  2. 要从NavigationDrawer侧面菜单切换窗口,我当然使用MainActivity
  3. 如果我需要显示一些新片段,我使用MainActivity中的方法将其替换为MainActivity布局中的window_container。 (重要 - 这让我很麻烦)。此方法称为AddFramgnet
  4. 为什么我需要这个?例如,我有主\详细视图,并希望显示一些新窗口。 enter image description here

    非常大的问题

    我使用嵌套片段和getChildFragmentManager。所以,它有独立的backstack

    场合

    1. 我在智能手机上添加详细视图(儿童靠背包含1个操作)
    2. 我按后退按钮。在我onBackPressed我做popBackStack和... 弹出我的片段与主\详情视图!
    3. 所以,我这样做:

          @Override
      public void onBackPressed() {
          DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
      
          if (drawer.isDrawerOpen(GravityCompat.START)) {
              //Скрываем меню, если она открыта
              drawer.closeDrawer(GravityCompat.START);
          }
          else
          {
              //Проход по стеку открытх фрагментов
              //super.onBackPressed();
              FragmentManager fm = getSupportFragmentManager();
      
              //if(fm.getBackStackEntryCount()>0) {
              if (current_fragment != null && current_fragment.getChildFragmentManager().getBackStackEntryCount() > 0)
              {
                  current_fragment.getChildFragmentManager().popBackStack();
                  //Log.d("Navigation", "Back: fragment popped from backstack. Backstack size: "+String.valueOf(fm.getBackStackEntryCount()));
              }
              else
                  finish();
                  //super.onBackPressed();
          }
      }
      

      您可以看到current_fragment变量。我在更换" windows"在NavigationDrawer侧边菜单事件中或当我调用AddFragment时。它有效,但不是所有时间。

      场合 我的应用中需要一些图库,智能手机上有3个窗口:

      1. 相册列表(AlbumsFragment
      2. 相册中的照片(GalleryFragment
      3. 照片预览(PreviewFragment
      4. ...当然是BaseFragment

        这是一个高手的详细视图,但对于平板电脑专辑视图(主人)看起来很奇怪,但它并不是完美的。还有第三个片段 - 预览,在平板电脑和智能手机上完成全部活动。 enter image description here

        我做了什么?

        1. 我使用基本片段并显示master \ detail fragment
        2. 我从MainActivity致电AddFragment以显示预览。
        3. 当我在backstack中显示预览情况时是这样的:

          主要背叛:

          1. 将片段BaseFragment替换为PreviewFragment
          2. BaseFragment子后台堆:

            1. 将片段AlbmumsFragment替换为GalleryFragment
            2. 当我向后按current_fragmentPreviewFragment时,我从主后台做popFromBackstack并将其替换为BaseFragments。它被称为OnCreate,它检查了布局,没有看到详细视图并显示...相册列表 - 主视图!

              当我在add情况下使用replace插入AddFragment方法时,情况有所不同,但也很糟糕:

              1. PreviewFragment已移除,我们会看到BaseFragment详细视图。好?否
              2. 当我们再次按回应用程序关闭时。为什么?
              3. current_fragment仍然是PreviewFragment,它的子堆栈是空的,所以称为主Backstack的popFromBackstack并弹出所有主\详细视图。

                问题

                那么,我需要做什么?我认为最好的解决方案是"不要使用嵌套片段和getChildFragmentManager"但是我不知道#39;要知道,如何使用NavigationDrawer实现master \ detail而不使用基本片段。

0 个答案:

没有答案