当前位置: 首页 > 知识库问答 >
问题:

Android后退按钮从后退中带来错误片段

唐弘益
2023-03-14

我正在编写一个android应用程序,使用框架布局和片段作为其组件

我有3个片段:社区片段TaskFormFramentTaskFrament

在社区片段中,用户按下一个按钮来创建一个任务。然后TaskFromFrament用addToBackStack替换FrameLayout中的社区片段。因为在那之后,我想用后退按钮返回社区片段。

在TaskFormFragment中,用户按create按钮创建任务。然后TaskFragment打开,没有添加堆栈,因为我不想在按下后退按钮时显示TaskFormFragment。

它们都工作得很好。当我按下TaskFragment中的back按钮时,CommunityFragment显示出来。然而,在那个之后,若我打开TaskFormFragment并按下back按钮,它不会显示CommunityFragment!相反,它会打开TaskFragment。

这是怎么发生的?这是我的片段转换代码:

从社区片段到任务格式片段:

TaskFormFragment newFragment = new TaskFormFragment();
Bundle args = new Bundle();
args.putLong("taskTypeId", taskTypeId);
args.putLong("communityId", community.getId());
newFragment.setArguments(args);

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();

从TaskFormFragment到TaskFragment:

TaskFragment newFragment = new TaskFragment();
Bundle args = new Bundle();
args.putLong("taskId", task.getId());
newFragment.setArguments(args);

FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.frame_container, newFragment);
transaction.commit();

编辑:我在以下条目中找到了解决方案:Android片段后堆栈问题

共有2个答案

南门志
2023-03-14

一旦用户在任务片段中按下back键并返回到社区片段,您应该清除BackBackback。你的问题是它没有被清除,所以当你按下back键时,你会转到上一笔交易。

编辑:

所以在你的社区片段被替换之前,运行这个

for(int i =0;i<fragmentmanager.getBackStackEntryCount();i++){
fragmentmanager.popbackstack();
}

看看能不能解决

谭玉泽
2023-03-14

我在另一个帖子中找到了解决方案。我已将该方法添加到包含FrameLayout的Activity类中:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
            this.finish();
            return false;
        } else {
            getSupportFragmentManager().popBackStack();
            removeCurrentFragment();
            return false;
        }
    }

    return super.onKeyDown(keyCode, event);
}


public void removeCurrentFragment() {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);

    if (currentFrag != null)
        transaction.remove(currentFrag);

    transaction.commit();
}

这个问题的描述和解决方案是在这里:Android片段背栈的问题

 类似资料:
  • 在写这个之前,我已经经历了很多stackoverflow问题。我对这个家伙的碎片背栈很困惑。 我在一个活动中的同一个容器上添加了三个片段 现在我想要的是,当用户按下片段3上的后退按钮时,它应该出现在第一个片段上,所以我已经覆盖了onBackPressed()方法。 但屏幕上什么也没发生,它让片段3继续运行。 更新 任何实现这一点的解决方案。

  • 我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。 实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。 我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。 下面是我的资产代码如何工作的简化版本。 在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有

  • 问题内容: 我想在片段类中禁用后退按钮。在此片段中似乎不起作用。如何禁用后退按钮? 这是我的示例代码: 问题答案: 您必须重写父FragmentActivity类的onBackPressed。因此,将您的代码放在父FragmentActivity中。或者,您可以使用以下方法调用父方法: 在FragmentActivity中重写onBackPressed方法,而不调用其超类来禁用后退按钮。

  • 我开始创建一个应用程序,它使用一个活动(导航抽屉)和许多片段。但我无法使用工具栏上的“后退”按钮从片段中导航回来。硬件后退按钮工作正常。我知道我需要覆盖选项ItemSelected,捕捉android。R、 id.home,检查后堆栈中是否有内容,然后弹出它。在更改片段后,“burger”按钮变为“back arrow”,但当我单击它时,选项ItemSelected将打开NavigationDra

  • 我正在使用Actionbar和它的“up”按钮从一个细节活动返回到主活动,这很好。类似地,用户可以按系统“后退”按钮返回到主活动。 在我的主要活动中,在中,从internet下载数据,以便在应用程序启动时显示。我注意到,当我使用Actionbar“up”按钮从细节转到主要活动时,运行,重新下载数据。但是当我使用系统“后退”按钮时,没有运行,因此立即显示主活动视图。 我在详细信息活动中用于实现“向上