Geo*_*rge 13 android android-fragments actionbarsherlock
我有一个片段,它有自己的状态(选定的按钮等).屏幕旋转时该状态丢失.
包含片段的活动在/ res/layout /中具有纵向布局,在/ res/layout-land /中具有几乎相同的横向布局.两种布局都包含这样的片段:
<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>
Run Code Online (Sandbox Code Playgroud)
我一直在测试的片段类是:
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) { ... }
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用3.0之前的支持包来通过ActionBarSherlock引入片段.
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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,onSaveInstanceState()永远不会被调用,而片段总是得到一个空savedInstanceState,在这两个onCreate()和onActivityCreated().
我尝试myFragment.setRetainInstance(true)过我的活动onCreate(),但这并没有改变任何事情.
我onSaveInstanceState()有一个@Override,所以我知道它不是像拼写错误那样愚蠢的东西.
我查看了一个ActionBarSherlock示例(com.actionbarsherlock.sample.shakespeare),并且onSaveInstanceState()正确调用其方法的片段.据我所知,这个例子写的是我的代码是如何 - 通过布局和布局 - 土地XML包含的片段.我甚至使用与我的主项目正在使用的完全相同版本的ActionBarSherlock来构建该示例,并且保存实例状态适用于该示例.
如何在屏幕旋转中保留我的碎片状态?为什么不onSaveInstanceState()被召唤?
Eri*_*Kok 23
您可以启用myFragment.setRetainInstance(true)保留状态,但它会"自动"执行此操作,即它保留分配给类成员的值,并且不使用onSaveInstanceState(因此savedInstanceState始终为null).
确保FragmentActivity托管此片段的主机不会覆盖,onSaveInstanceState或者它应该调用它super.onSaveInstanceState(Bundle).
| 归档时间: |
|
| 查看次数: |
24428 次 |
| 最近记录: |