gpt4 book ai didi

android - 为什么我的 fragment onSaveInstanceState() 没有被调用?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:21:07 26 4
gpt4 key购买 nike

我有一个 fragment ,它有自己的状态(选定的按钮等)。该状态会在屏幕旋转时丢失。

包含 fragment 的 Activity 在/res/layout/中有纵向布局,在/res/layout-land/中有几乎相同的横向布局。两种布局都包含这样的 fragment :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment
android:id="@+id/testFragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
class="au.com.x.y.TestFragment" />
...</LinearLayout>

我一直在测试的 fragment 类是:

public class TestFragment extends android.support.v4.app.Fragment {
private static final String TAG = "TestFragment";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate(): " +
(savedInstanceState != null ? "NOT NULL" : "NULL"));
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.i(TAG, "onActivityCreated(): " +
(savedInstanceState != null ? "NOT NULL" : "NULL"));
}
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
Log.i(TAG, "onSaveInstanceState()");
state.putString("saved_thing", "some_value");
}
public View onCreateView(
LayoutInflater inflater,
ViewGroup container,
Bundle b) { ... }
}

请注意,我使用的是通过 ActionBarSherlock 引入的 pre-3.0 fragment 支持包。

LogCat 给我:

BEFORE SCREEN ROTATION (PORTRAIT):
02-23 11:45:58.015: I/TestFragment(22629): onCreate(): NULL
02-23 11:45:58.015: I/TestFragment(22629): onCreateView()
02-23 11:45:58.035: I/TestFragment(22629): onActivityCreated(): NULL
AFTER SCREEN ROTATION (LANDSCAPE):
02-23 11:46:00.615: I/TestFragment(22629): onCreate(): NULL
02-23 11:46:00.615: I/TestFragment(22629): onCreateView()
02-23 11:46:00.635: I/TestFragment(22629): onActivityCreated(): NULL

如您所见,onSaveInstanceState() 永远不会被调用, fragment 总是在 onCreate() 中得到一个空的 savedInstanceStateonActivityCreated()

我已经在 Activity onCreate() 中尝试了 myFragment.setRetainInstance(true),但这并没有改变任何东西。

我的 onSaveInstanceState() 有一个@Override,所以我知道这不是像拼写错误这样愚蠢的事情。

我查看了一个 ActionBarSherlock 示例 (com.actionbarsherlock.sample.shakespeare),其中的 fragment 正确调用了它们的 onSaveInstanceState() 方法。据我所知,该示例完全按照我的代码编写 - 通过布局和布局域 XML 包含的 fragment 。我什至使用与我的主项目使用的 ActionBarSherlock 完全相同的版本构建了该示例,并且保存实例状态对于该示例来说效果很好。

如何在屏幕旋转时保持 fragment 状态?为什么 onSaveInstanceState() 没有被调用?

最佳答案

您可以启用 myFragment.setRetainInstance(true) 来保留状态,但它会“自动”执行此操作,即它保留分配给您的类成员的值并且不使用 onSaveInstanceState(并且因此 savedInstanceState 始终为空)。

确保托管此 fragment 的 FragmentActivity 不会覆盖 onSaveInstanceState,或者在覆盖时应调用 super.onSaveInstanceState(Bundle)

关于android - 为什么我的 fragment onSaveInstanceState() 没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9405577/

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