gpt4 book ai didi

android - 具有多个 fragment 和屏幕方向的单个 Activity

转载 作者:行者123 更新时间:2023-11-29 16:01:28 25 4
gpt4 key购买 nike

我目前正在处理 Android 的问题,它是屏幕旋转的重新创建周期:

我有一个 Activity 和许多 Fragments (Support-V4)。例如,登录是在带有 fragment 的单个 Activity 上,当登录然后应用程序更改其导航行为并使用多个 fragment 时,我这样做了,因为在 fragment A 到 fragment B 之间传递数据比传递数据容易得多 Activity A 到 Activity B 之间的数据。

所以我的问题是在我旋转设备时出现的,在我的第一种方法中,初始 fragment 已加载,但是会发生什么,如果用户它在第 15 页并旋转它的设备,它将返回到 fragment 1 并且给一个非常糟糕的用户体验。我将所有 fragment 设置为保留它们的实例,并在创建时将其添加到 MainActivity 中:

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
initBackStackManager();
initControllers();
mayDownloadData();
setTitle();
if(savedInstanceState == null){
addAreaFragment();
}
}

现在,第一个 fragment 在屏幕方向改变后没有加载,但是如果我尝试进行 fragment 事务,它说Can not perform FragmentTransaction.commit() after onSaveInstanceState(),是否有处理这个的方法?或者我真的真的需要使用多个 Activity 并在其中嵌入 Fragment 吗?

非常感谢!

已编辑我忘了补充一点,这只发生在特定的 fragment 上......例如,我有以下 fragment 流:

AreaFragment -> WaiterSelectionFragment -> WaiterOptionsFragment.

如果我在 AreaFragment 中并且我旋转 设备,我仍然可以添加/替换 fragment 并且没有任何反应,不会抛出任何错误。如果我在 WaiterSelectionFragment 上,也不会发生错误。但是,如果我在 WaiterOptionsFragment 上,则会抛出错误。 WaiterSelectionFragment 具有以下结构:

  1. 线性布局
  2. fragment 标签主机

FragmentTabHost里面有一些 fragment ,这就是错误发生的地方。您可能想知道为什么选择 FragmentTabHost?很简单,客户希望该应用程序显示 TabBar,如果我使用 native Android 选项卡,选项卡会重新排列到 ActionBar横向位置。

编辑 2

我已经使用了@AJ Macdonald 提供的方法,但到目前为止还没有成功。我在 onSaveInstanceState(Bundle) 方法中保存了我的当前 fragment ,并在 Android Activity 的 onRestoreInstanceState(Bundle) 方法中恢复了我的 fragment ,我恢复了我的 back 按钮和当前 Fragment 但当我到达第三个 Fragment 时,错误仍然发生。我正在使用 ViewPager 包含 4 个 fragment ,这会导致问题吗?仅在应用程序的这一部分发生。我有 4 个(主要工作流程) fragment ,在第一个、第二个和第三个 fragment 上没有显示错误,仅在 ViewPager 上显示 部分。

最佳答案

为您的每个 fragment 指定一个唯一的标签。

在您的 Activity 的 onSaveInstanceState 中,存储当前 fragment 。 (如果您保留一个每次 fragment 更改时自动更新的变量,这可能是最容易做到的。)

在您的 Activity 的 onCreateonRestoreInstanceState 中,将标记从已保存的包中拉出并启动该类型的新 fragment 。

public static final int FRAGMENT_A = 0;
public static final int FRAGMENT_B = 1;

private int currentFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//other stuff
if(savedInstanceState == null){
addAreaFragment();
currentFragment = FRAGMENT_A;
}else{
currentFragment = savedInstanceState.getInt("currentFragment");
switch(currentFragment){
case FRAGMENT_A:
addAreaFragment();
break;
case FRAGMENT_B:
addFragmentB();
}
}
}


// when you switch fragment A for fragment B:
currentFragment = FRAGMENT_B;


@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt("currentFragment", currentFragment);
super.onSaveInstanceState(savedInstanceState);
}

关于android - 具有多个 fragment 和屏幕方向的单个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24420897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com