【问题标题】:Wrong fragment is displayed on orientation change方向改变时显示错误的片段
【发布时间】:2015-10-21 07:50:34
【问题描述】:

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

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

【问题讨论】:

  • 发布代码,了解如何调用各种片段以在方向更改时将其放入框架布局中。
  • @DJphy 检查编辑。
  • 显示抽屉的代码。另外,显示“MainActivity”的 onResume。
  • 在问题中添加代码
  • 在 withOnDrawerItemClickListener 中,情况二也是你调用 fragment A,可能是故意的;(我不知道).. 我没找到调用片段的方向改变代码

标签: android android-fragments android-lifecycle materialdrawer


【解决方案1】:

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


如果应用程序已创建并且您没有激活它,抽屉将不会触发OnDrawerItemClickListener。您可以通过 withFireOnInitialOnClick(true) 标志启用此功能。这将允许您在OnDrawerItemClickListener 中拥有整个片段切换逻辑

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

您为此使用此代码:

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

回到您的OnDrawerItemClickListener,只要您在上面发布的代码显示您使用基于 R.string 的开关。通过getNameRes() 方法。这不会真正起作用,因为您不是通过资源设置项目的 name 而是直接作为字符串。 .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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多