将片段添加到后退堆栈时后退按钮不起作用
Back button not working when adding fragment to backstack
我一直在想办法解决这个问题。
首先我会说有很多 Whosebug 解决方案,但大多数人说自己连接 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,则后退按钮将关闭包含的片段,如果我这样做,后退按钮将无响应,我将永远看到蓝屏。
我发现的每个 Whosebug 解决方案都说要自己连接 onBackPressed(),这确实有效,但我不明白为什么我不能通过 .addToBackStack 免费获得该行为
在文档中找不到任何相关内容,但它应该有效。
更新:
我发现它不起作用,因为我在 activity 的 onBackPress 中阻止了它。所以没有它它会按预期工作。也就是说,如果您需要的话,这是输入验证并阻止它工作的好地方:)
将 onBackPressed()
覆盖到您的 activity 中并调用它以便从后台删除当前片段,因为您添加了它。
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStackImmediate()
} else {
finish();
}
这仅在您使用 addToBackStack()
方法将片段添加到 backstack 时有效。
当您将一个片段添加到 backstack 以继续跟踪您的回流和之前的所有更改时,该实例将保留在 FragmentManager
中。当你想回到上一个片段时,只需从后台弹出最新的片段。如果不加入堆栈,将无法回滚已走的路径和之前的所有操作。
看来您知道如何解决您 运行 遇到的问题,而您的 post 似乎在问一个具体问题,所以我会回答:
I don't understand why I don't get that behavior for free with the .addToBackStack
确实如此!但只是在一定程度上。后退按钮将自动通过后退堆栈导航返回,但如果没有可导航返回的内容,则它不会 关闭 最后一个片段。因此,如果您要将另一个片段添加到后退堆栈(而不是覆盖后退按钮),它会自动将用户导航回您的第一个片段,但之后什么都不做。
我一直在想办法解决这个问题。
首先我会说有很多 Whosebug 解决方案,但大多数人说自己连接 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,则后退按钮将关闭包含的片段,如果我这样做,后退按钮将无响应,我将永远看到蓝屏。
我发现的每个 Whosebug 解决方案都说要自己连接 onBackPressed(),这确实有效,但我不明白为什么我不能通过 .addToBackStack 免费获得该行为 在文档中找不到任何相关内容,但它应该有效。
更新: 我发现它不起作用,因为我在 activity 的 onBackPress 中阻止了它。所以没有它它会按预期工作。也就是说,如果您需要的话,这是输入验证并阻止它工作的好地方:)
将 onBackPressed()
覆盖到您的 activity 中并调用它以便从后台删除当前片段,因为您添加了它。
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStackImmediate()
} else {
finish();
}
这仅在您使用 addToBackStack()
方法将片段添加到 backstack 时有效。
当您将一个片段添加到 backstack 以继续跟踪您的回流和之前的所有更改时,该实例将保留在 FragmentManager
中。当你想回到上一个片段时,只需从后台弹出最新的片段。如果不加入堆栈,将无法回滚已走的路径和之前的所有操作。
看来您知道如何解决您 运行 遇到的问题,而您的 post 似乎在问一个具体问题,所以我会回答:
I don't understand why I don't get that behavior for free with the .addToBackStack
确实如此!但只是在一定程度上。后退按钮将自动通过后退堆栈导航返回,但如果没有可导航返回的内容,则它不会 关闭 最后一个片段。因此,如果您要将另一个片段添加到后退堆栈(而不是覆盖后退按钮),它会自动将用户导航回您的第一个片段,但之后什么都不做。