android - 在 BackPressed 上跳过一些 fragment

标签 android android-fragments

我对 android fragments 还很陌生,所以请多多包涵。

我有一堆使用单个 Activity 作为宿主的 fragment 。

在我看来,我的 fragment 是按部分分组的,尽管它们仍然是模块化的/可按代码重用。 考虑这个理想的场景:

Frag1 -> (Press Next) -> Frag2 -> (Press Next) -> Frag3 -> (Press Back) -> Frag1

在浏览了一系列 fragment 之后,我想在按下后退按钮时跳过之前的一些 fragment (在这种情况下,跳过 fragment 2)。

但是,在我当前的代码中,我的问题是即使它返回到 Frag1,Frag3 也不会从屏幕上消失。发生的情况是 Frag1 和 Frag3 变得可见。

这是我的相关代码 fragment :

创建 Frag1 的代码 fragment

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    // init the fragment (with a default fragment, not null)
    Fragment fragment = PlaceholderFragment.newInstance(position + 1);
    // Position number from navigation sidebar starts from 0.
    // Since position starts from 0, add 1 to match section number
    // as implemented in {@link #onSectionAttached()}
    switch(position) {
        case 0:
            fragment = PlaceholderFragment.newInstance(position + 1);
            break;
        case 1: // Frag1 case
            fragment = new AddPointsFragment().newInstance(position + 1, "");
            break;
        default:
            break;
    }
    // update the main content by replacing fragments
    FragmentManager fragmentManager = getFragmentManager();
    // clear all fragments from previous section from the back stack
    fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    // replace all currently added fragments in container and replace with the new fragment
    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment)
            .commit();
}

创建 Frag2 的代码 fragment

public void onEnterButtonFragmentInteraction(int sectionNumber, String cardNo) {
    // TODO: Add point for given card number
    int points = 5; //sample points
    AddPointsSuccessFragment addPointsSuccessFragment =
            new AddPointsSuccessFragment().newInstance(sectionNumber, cardNo, points);
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.container, addPointsSuccessFragment)
            .addToBackStack(null)
            .commit();
}

创建 Frag3 的代码 fragment

public void onOkButtonFragmentInteraction(int sectionNumber, String cardNo, int points) {
    RedeemRewardFragment redeemRewardFragment =
                new RedeemRewardFragment().newInstance(sectionNumber, cardNo, points);
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.container, redeemRewardFragment);
        fragmentTransaction.commit();
}

我目前的解决方法是在创建 Frag3 并运行此代码时添加 .addToBackStack(null)

public void onBackButtonFragmentInteraction() {
    this.onBackPressed(); // simulate pressing of activity back button
    FragmentManager fragmentmanager = getFragmentManager();
    fragmentmanager.popBackStack(); // pop Frag2 from back stack
}

在调用 onBackPressed() 方法之后。不幸的是,这种解决方法很难看,因为在转到 Frag1 之前 Frag2 会瞬间出现。

最佳答案

所以你的解决方案的关键是这个人:

.addToBackStack(null)

您可以为该特定交易传入一个字符串标识符,而不是 null——例如, fragment 的类名就是我们使用的名称(尽管如果您在同一 fragment 上有多个实例,那将不起作用后台):

.addToBackStack(Fragment1.class.getName())

然后,如果您想从 Fragment3 返回到 Fragment1,只需使用下一个 fragment 的标识符弹出,并传递 INCLUSIVE 标志(这意味着它还将弹出您指定的下一个 fragment ):

getFragmentManager().popBackStack(
        Fragment2.class.getName(), 
        FragmentManager.POP_BACK_STACK_INCLUSIVE);

它将按预期播放您的动画,但就好像中间的 fragment 从未存在过一样。我建议使用 next fragment 的原因是因为您可能不希望在返回堆栈上进行第一个 fragment 事务。

关于android - 在 BackPressed 上跳过一些 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25875975/

相关文章:

android - 如何将 Kotlin 流程拆分为 2 个流程?

android - ListView 从自定义 BaseAdapter 中删除项目

java - 从父 Activity 获取值返回 null

java - Android - 来自 ArrayAdapter 的 fragment

android - 无论如何交换或重新排序 fragment BackStack 条目?

android - 如何在TextView中显示EditText闪烁的光标?

安卓应用内计费 : onServiceConnected is never called and bindService returns "false"

android - React Native 中 redux-saga 的 API 集成错误

android - 无法解析符号 PreferenceFragmentCompat

Android fragment 或布局——需要建议