![](/img/trans.png)
[英]IllegalArgumentException: savedInstanceState Specified as Non-Null is Null
[英]Why Fragment unable receive a non-null savedInstanceState bundle during rotation, if it is created through XML?
我有以下非常簡單的片段。
package com.example.test;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.actionbarsherlock.app.SherlockFragment;
/**
* This is a fragment showing UI that will be updated from work done
* in the retained fragment.
*/
public class UiFragment extends SherlockFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.i("CHEOK", "UiFragment onActivityCreated");
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i("CHEOK", "UiFragment onCreateView");
View v = inflater.inflate(R.layout.uifragment, container, false);
return v;
}
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i("CHEOK", "UiFragment onCreate");
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
Log.i("CHEOK", "--> UiFragment able get savedInstanceState's data : " + savedInstanceState.getInt("value"));
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("value", 111222);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="fragment_retain_instance_msg" />
</LinearLayout>
我意識到是否可以通過Java代碼將其附加到FragmentActivity。
package com.example.test;
import android.os.Bundle;
import android.util.Log;
import com.actionbarsherlock.app.SherlockFragmentActivity;
public class MainActivity extends SherlockFragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("CHEOK", "MainActivity onCreate");
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
Log.i("CHEOK", "--> MainActivity able get savedInstanceState's data : " + savedInstanceState.getInt("value"));
}
// ???
//setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(android.R.id.content,
new UiFragment()).commit();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("value", 888999);
}
}
每次執行旋轉時,我的Fragment
都能在onCreate
期間獲取非null savedInstanceState
02-26 00:36:48.777: I/CHEOK(17740): MainActivity onCreate
02-26 00:36:48.812: I/CHEOK(17740): UiFragment onCreate
02-26 00:36:49.031: I/CHEOK(17740): UiFragment onCreateView
02-26 00:36:49.035: I/CHEOK(17740): UiFragment onActivityCreated
[Rotation happens here]
02-26 00:37:37.472: I/CHEOK(17740): MainActivity onCreate
02-26 00:37:37.472: I/CHEOK(17740): UiFragment onCreate
02-26 00:37:37.472: I/CHEOK(17740): --> UiFragment able get savedInstanceState's data : 111222
02-26 00:37:37.472: I/CHEOK(17740): --> MainActivity able get savedInstanceState's data : 888999
02-26 00:37:37.511: I/CHEOK(17740): UiFragment onCreateView
02-26 00:37:37.511: I/CHEOK(17740): UiFragment onActivityCreated
但是,如果我替換了MainActivity
的onCreate
的代碼
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().add(android.R.id.content,
new UiFragment()).commit();
}
通過XML創建片段
setContentView(R.layout.activity_main);
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<fragment class="com.example.test.UiFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
執行輪換時,我將獲得以下日志。
02-26 00:39:23.437: I/CHEOK(18055): MainActivity onCreate
02-26 00:39:23.734: I/CHEOK(18055): UiFragment onCreate
02-26 00:39:23.734: I/CHEOK(18055): UiFragment onCreateView
02-26 00:39:23.754: I/CHEOK(18055): UiFragment onActivityCreated
[Rotation happens here]
02-26 00:39:27.703: I/CHEOK(18055): MainActivity onCreate
02-26 00:39:27.703: I/CHEOK(18055): --> MainActivity able get savedInstanceState's data : 888999
02-26 00:39:27.746: I/CHEOK(18055): UiFragment onCreate
02-26 00:39:27.746: I/CHEOK(18055): UiFragment onCreateView
02-26 00:39:27.750: I/CHEOK(18055): UiFragment onActivityCreated
為什么Fragment
行為有如此不同? 如果Fragment
通過XML創建, 為什么在旋轉期間Fragment
無法接收到非null的savedInstanceState包 ?
要實例化的片段必須具有某種唯一標識符,以便在需要銷毀並重新創建父活動時可以將其與先前的實例重新關聯。 可以通過以下方式提供:
提供ID以片段化XML標簽可解決此問題。
<fragment class="com.example.test.UiFragment"
android:id="@+id/myFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.