【问题标题】:Back button not working when adding fragment to backstack将片段添加到后台堆栈时后退按钮不起作用
【发布时间】:2017-05-16 20:28:28
【问题描述】:

我一直在努力解决这个问题。

首先我会说有很多 StackOverflow 解决方案,但大多数人说自己连接 onBackPressed(),这确实有效,但我不明白为什么我不明白.addToBackStack 的行为免费

在文档中找不到任何相关的东西,除了它应该有效。

我正在使用最简单的形式将片段添加到后台

getActivity().getSupportFragmentManager().beginTransaction().add(R.id.create_fragment_holder2, new MyFragment(), TAG).addToBackStack(TAG).commit();

getActivity 是一个 FragmentActivity。 与此 FrameLayout 一起使用:

 <FrameLayout
        android:id="@+id/create_card_fragment_holder2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

还有一个带有蓝色背景的 TextView 的简单片段

public class MyFragment extends Fragment{

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
        @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.my_layout, container, false);
}}

问题是,如果我不询问 .addToBackStack,那么后退按钮将关闭包含的片段,如果我这样做,后退按钮将无响应,我将永远看到那个蓝屏。

我发现的每个 StackOverflow 解决方案都说要自己连接 onBackPressed(),这确实有效,但我不明白为什么我没有使用 .addToBackStack 免费获得这种行为 除了应该有效之外,在文档中找不到任何相关内容。

更新: 我发现它不起作用,因为我在活动的 onBackPress 中阻止了它。因此,如果没有它,它将按预期工作。也就是说,如果您需要,这是输入验证并阻止其工作的好地方:)

【问题讨论】:

  • 您说的是硬件后退按钮,还是操作栏中的向上按钮?
  • 硬件一
  • 我做到了。它没有改变行为(意味着如果我添加到 backstack,后退按钮仍然没有响应)
  • 您是否还有其他正在运行的片段,或者只有这个片段?
  • 类似于@WoogieNoogie 的问题,你确定你只添加了这个MyFragment 一次吗?

标签: android android-fragments fragment-backstack


【解决方案1】:

将onBackPressed() 覆盖到您的活动中并调用它以从后台堆栈中删除当前片段,因为您添加了它。

if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
    getSupportFragmentManager().popBackStackImmediate()
} else {
    finish();
}

这仅在您使用addToBackStack() 方法将片段添加到后台堆栈时才有效。

当您将片段添加到 backstack 以继续跟踪您的回流和所有以前的更改时,该实例将保留在 FragmentManager 中。当你想回到上一个片段时,只需从 backstack 中弹出最新的片段。如果不将其添加到堆栈中,您将无法回滚已采取的路径以及之前的所有操作。

【讨论】:

    【解决方案2】:

    您似乎知道如何解决您遇到的问题,而且您的帖子似乎在问一个特定的问题,所以我会回答:

    我不明白为什么我不能通过 .addToBackStack 免费获得这种行为

    确实如此!但只是到了一定程度。后退按钮将自动通过后退堆栈导航返回,但如果没有可导航返回的内容,它不会关闭最后一个片段。因此,如果您要将另一个片段添加到后退堆栈(而不是覆盖后退按钮),它会自动将用户导航回您的第一个片段,但之后什么也不做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      相关资源
      最近更新 更多