0

我知道这个特定问题有几个答案,但是没有一个能帮助我解决它。

我正在开发一个具有抽屉导航(Mike Penz 抽屉导航)的应用程序。通过选择任何项目,用户被导航到相应的片段。片段完美地工作,并在方向变化时保持其状态。但是,其中一个片段有一个按钮,可以用新片段替换当前片段。当新片段出现在屏幕上时,如果用户改变了设备的方向,则会显示前一个片段。

流程:抽屉项目选择>片段A>按钮>片段B>改变方向>片段A。

编辑: 这就是第一个片段的名称:(开关)

case R.string.drawer_item_a:
      FragmentA A = FragmentA.newInstance();
      getSupportFragmentManager().beginTransaction()
           .replace(R.id.container, A)
           .commit();
      break;

这就是第二个片段的名称:

@Override
   public void onClick(View v) {
       FragmentManager fm = getActivity().getSupportFragmentManager();
       FragmentB B = FragmentB.newInstance();
       fm.beginTransaction()
           .replace(R.id.container, B, String.valueOf(R.string.settings_pin_request))
           .commit();
   }

抽屉

result = new Drawer()
            .withActivity(this)
            .withToolbar(mToolbar)
            .withActionBarDrawerToggle(true)
            .addDrawerItems(
                    new PrimaryDrawerItem().withName("FragmentA"),
        new PrimaryDrawerItem().withName("FragmentB")
            )
            .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) {

                    if (drawerItem instanceof Nameable) {
                        mCurrentDrawerItem = position;

                        // Display appropriate fragment
                        switch (((Nameable) drawerItem).getNameRes()) {
                  case R.string.drawer_item_a:
                    FragmentA A = FragmentA.newInstance();
                    getSupportFragmentManager().beginTransaction()
                       .replace(R.id.container, A)
                       .commit();
                  break;
                  case R.string.drawer_item_b:
                    FragmentA A = FragmentA.newInstance();
                    getSupportFragmentManager().beginTransaction()
                       .replace(R.id.container, A)
                       .commit();
                  break;

                        }
                        mToolbar.setTitle(MainActivity.this.getString(((Nameable) drawerItem).getNameRes()));
                    }
                }
            }).build();

    // Set the current drawer item
    result.setSelection(mCurrentDrawerItem);

onResume() 方法实现了用户同步的逻辑。没有为片段状态编写任何内容。

4

1 回答 1

0

根据问题中使用的版本(MaterialDrawer v3.xy)回答。答案需要进行一些更改才能使用最新的 MaterialDrawer v4.xy


如果创建了应用程序并且您没有激活它,抽屉将不会触发OnDrawerItemClickListener. 您可以通过withFireOnInitialOnClick(true)标志启用此功能。这将允许您在OnDrawerItemClickListener

如果未设置,则必须在方向更改后自行设置正确的片段。

您为此使用此代码:

// Set the current drawer item
result.setSelection(mCurrentDrawerItem);

回到OnDrawerItemClickListener您在上面发布的代码显示您使用基于 R.string 的开关。通过getNameRes()方法。这不会真正起作用,因为您没有通过资源设置项目的名称,而是直接设置为字符串。.withName("FragmentA"). 你应该在这两种情况下使用相同的。一个更好的解决方案(我强烈建议这样做)是您切换代码并OnDrawerItemClickListener根据您在DrawerItems

result = new Drawer()
    .withActivity(this)
    .withToolbar(mToolbar)
    .withActionBarDrawerToggle(true)
    .addDrawerItems(
            new PrimaryDrawerItem().withName("FragmentA").withIdentifier(1),
          new PrimaryDrawerItem().withName("FragmentB").withIdentifier(2)
    )
    .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id, IDrawerItem drawerItem) {
              if(drawerItem != null) {
                  Fragment f = null;
                  switch(drawerItem.getIdentifier) {
                  case 1:
                    f = FragmentA.newInstance();
                  break;
                  case 2:
                    f = FragmentA.newInstance();

                  break;
                  }

                  if (drawerItem instanceof Nameable) {
                    mToolbar.setTitle(MainActivity.this.getString(((Nameable) drawerItem).getNameRes()));
                  }
              }
            }
        }
    }).build();
于 2015-10-28T20:20:34.290 回答