FragmentTransaction 在 Activity 重新创建时隐藏()(配置 change/etc)
FragmentTransaction hide() upon Activity recreation(config change/etc)
当 Activity 在配置更改(旋转等)时重新创建时,FragmentTransaction 的 hide() 不会持续存在。
它重新添加了后台堆栈中的所有片段,因此之前隐藏的片段变得可见。例如)片段 A(隐藏)、B(显示)、C(隐藏)、D(隐藏)在后栈中。例如,当我旋转时,它会在加载 A、B 和 C 后在顶部显示片段 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 class。 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();
}
}
在您展示的应用程序中,它们可能是基于容器 ID 的 removing/adding 片段。同时还使用 onSaveInstanceState 和 onCreate 或 onCreateView
中的 savedInstanceState 包维护片段状态
问题中的代码确实有效。需要注意的一件事是,如果 hidden()
在从配置更改重新创建期间在片段中为真,则不要设置操作栏标题。
感谢@Scrotos 的聊天。
当 Activity 在配置更改(旋转等)时重新创建时,FragmentTransaction 的 hide() 不会持续存在。
它重新添加了后台堆栈中的所有片段,因此之前隐藏的片段变得可见。例如)片段 A(隐藏)、B(显示)、C(隐藏)、D(隐藏)在后栈中。例如,当我旋转时,它会在加载 A、B 和 C 后在顶部显示片段 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 class。 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();
}
}
在您展示的应用程序中,它们可能是基于容器 ID 的 removing/adding 片段。同时还使用 onSaveInstanceState 和 onCreate 或 onCreateView
中的 savedInstanceState 包维护片段状态问题中的代码确实有效。需要注意的一件事是,如果 hidden()
在从配置更改重新创建期间在片段中为真,则不要设置操作栏标题。
感谢@Scrotos 的聊天。