【发布时间】:2016-10-11 00:41:33
【问题描述】:
在配置更改(旋转等)后重新创建 Activity 时,FragmentTransaction 的 hide() 不会持续存在。
它将所有片段重新添加到后台堆栈中,因此之前隐藏的片段变得可见。例如)片段 A(隐藏)、B(显示)、C(隐藏)、D(隐藏)在后堆栈中。例如,当我旋转时,它会在加载 A、B 和 C 后在顶部显示 Fragment D。
FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
// Hide all fragments other than the first
for (int i = 1; i < fragments.length; i++) {
if (fragments[i] != null) {
ft.hide(fragments[i]);
}
}
// Display only the first fragment
if (fragments[0].isAdded()) {
ft.show(fragments[0]);
}
else {
ft.add(R.id.content_view, fragments[0], fragmentTag);
}
ft.commit();
有什么解决方法吗?
[编辑]为问题的上下文添加细节。
我想要完成的是让底栏(我的自定义视图只是告诉我点击了哪个选项卡)我可以在片段之间切换到它所处的相同状态。
Instagram、Quora 和 Google Plus 应用就是一个例子。
[编辑 2 以响应 Scrotos]
这是在我的 Presenter 类中。 loadFirstScreen() 执行上面的片段事务。其他的只是初始化,比如设置内容和注册监听器。
public void onCreate(Bundle savedInstanceState) {
mView.initActionbar();
mView.initViews();
mModel.getUserProfile().subscribe(new Subscriber<UserProfile>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(UserProfile userProfile) {
mView.initDrawer(userProfile);
}
});
if (savedInstanceState == null) {
mView.loadFirstScreen();
}
}
【问题讨论】:
-
为什么要隐藏片段而不是添加/删除它们?
-
我进行了编辑以提供问题的更多背景信息。当我添加/删除/替换时,片段将经历像 onCreateView 这样的生命周期来重建自身。我可以通过生命周期方法,但我希望片段具有与以前相同的视图状态;例如回收站视图滚动位置等。
-
您应该将片段的状态保存在 onSaveInstanceState 中,包括 recyclerview 滚动位置,然后根据 onCreate 或 onCreateView 中的捆绑包设置滚动位置
-
您是否确保不重新添加片段?我可以在活动中看到您的 onCreate 吗?您是否正在检查 savedInstanceStateBundle 是否存在,如果存在则不重新创建片段?您是否将交易添加到后台堆栈?
标签: android android-fragments fragmenttransaction fragmentmanager