方向更改时会显示错误的片段

时间:2015-10-21 07:50:34

标签: android android-fragments android-lifecycle materialdrawer

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

我正在开发一个具有抽屉导航(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()方法实现用户同步的逻辑。没有为片段状态编写任何内容。

1 个答案:

答案 0 :(得分:0)

  

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

如果创建了应用程序而您没有激活它,则抽屉不会触发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();