【问题标题】:Back on incorrect tab inside tablayout with Fragments返回带有片段的选项卡布局内的不正确选项卡
【发布时间】:2018-04-25 11:41:11
【问题描述】:

这是我的应用程序的流程。

产生错误的步骤。

  • 打开应用,第一个屏幕会是 Fragment A1
  • 从 A1 转到片段 A2
  • 点击 Tab B,即 Fragment B1
  • 从 B1 转到片段 B2
  • 点击选项卡 A(屏幕显示 A2)
  • * 点击BACK,屏幕不变。如果我点击选项卡 B,我可以看到屏幕回到 B1。

如果我在 A2 上点击 BACK,任何解决方法,我都可以返回 A1。

顺便说一句,我在 A2 和 B2 上检查 getBackStackEntryCount()。我可以看到最终的 backStackEntryCount 是 2。

下面是我的代码

从 A1 到 A2 或 B1 到 B2

ChildVC childFrag = new ChildVC();
getFragmentManager().beginTransaction().add(R.id.frameChildFragment, childFrag)
    .addToBackStack(null)
    .commit(); 

【问题讨论】:

  • 您需要在 addToBackStack("childFrag") 中添加标签或 id 并使用 .replace(R.id.frameChildFragment, childFrag) 代替 .add(R.id.frameChildFragment, childFrag)
  • 标签怎么处理?而且,我想添加也可以吗?因为它只是保存数据。
  • 查看我处理标签的答案

标签: android android-fragments android-tablayout


【解决方案1】:
FragmentManager fragmentManager;
FragmentTransaction fragmentTransaction;
Fragment currentFragment;

用于推送片段:

public void pushFragment(Fragment fragment, boolean addToBackStack, boolean shouldAnimate, Bundle bundle) {

        currentFragment = fragment;

        if (bundle != null) {
            fragment.setArguments(bundle);
        }
        fragmentTransaction = fragmentManager.beginTransaction();

        if (shouldAnimate) {
            fragmentTransaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);
        } else {
            fragmentTransaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
        }
        if (addToBackStack) {
            fragmentTransaction.addToBackStack(fragment.getClass().getCanonicalName());
        }

        // Replace whatever is in the fragment_container dataView with this fragment,
        // and add the transaction to the back stack so the user can navigate back
        fragmentTransaction.replace(R.id.container, fragment, fragment.getClass().getCanonicalName());



        // Commit the transaction
        fragmentTransaction.commit();

    }

对于流行片段:

public void popBackFragment() {

        try {
            int backStackCount = fragmentManager.getBackStackEntryCount();

            if (backStackCount > 1) {

                FragmentManager.BackStackEntry backStackEntry = fragmentManager.getBackStackEntryAt(backStackCount - 2);

                String className = backStackEntry.getName();

                Fragment fragment = fragmentManager.findFragmentByTag(className);

                currentFragment = fragment;

                fragmentManager.popBackStack();
            } else {

                  finish();

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

【讨论】:

  • 那么,我们只需要 1 个容器?应该在activity中设置哪个?
  • 我们需要一个容器,它应该是framelayout
  • 是...在活动中,但您也可以将其用于其他容器,您需要在推送方法中再传递一个参数
  • 天哪。我有每个片段的容器。让我试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多