【问题标题】:Android back button brings wrong fragment from backstackAndroid后退按钮从backstack中带来错误的片段
【发布时间】:2014-01-07 22:56:49
【问题描述】:

我正在编写一个使用FrameLayoutFragments 作为组件的android 应用程序。

我有 3 个片段:CommunityFragmentTaskFormFragmentTaskFragment

在 CommunityFragment 中,用户按下按钮来创建任务。然后 TaskFromFragment 替换为 FrameLayout 中的 CommunityFragment with addToBackStack。因为在那之后,我想用返回按钮返回 CommunityFragment。

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

所有这些都完美无缺。当我在 TaskFragment 中按下返回按钮时,会显示 CommunityFragment。但是,在那之后,如果我打开 TaskFormFragment 并按返回按钮,它不会显示 CommunityFragment!相反,它会打开 TaskFragment。

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

CommunityFragmentTaskFormFragment

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();

TaskFormFragmentTaskFragment

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();

编辑:我在这篇文章中找到了解决方案:Problems with Android Fragment back stack

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    我在另一篇文章中找到了解决方案。我已将这些方法添加到包含 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();
    }
    

    这个问题的描述和解决方法在这里: Problems with Android Fragment back stack

    【讨论】:

      【解决方案2】:

      一旦用户按回任务片段并返回社区片段,您应该清除您的后台堆栈。您的问题是它没有被清除,所以当您按下返回时,您会转到上一个交易。

      编辑:

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

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

      看看能不能解决

      【讨论】:

      • 但是我没有将TaskFragment添加到backstack?所以我什至没有给它起名字。如何清除它?
      • 问题是TaskFragment替换为CommunityFragment。我没有将 TaskFragment 添加到后台堆栈。它从 TaskFormFragment 返回到 TaskFragment,并从 backstack 中删除 CommunityFragment。我无法回到它。
      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多