gpt4 book ai didi

android - 为什么 onCreate Bundle 和 onSaveInstanceState Bundle 在 Fragment 中不同?

转载 作者:行者123 更新时间:2023-11-30 01:55:35 24 4
gpt4 key购买 nike

我环顾四周,但找不到这个确切问题的答案。

在一个 Activity 中这个简单的程序:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState!=null)Log.e("SaveInstanceState", "onCreate Bundle " + savedInstanceState.hashCode()+" " + this.getClass().getSimpleName());
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e("SaveInstanceState", "onSaveInstanceState Bundle " + outState.hashCode()+" " + this.getClass().getSimpleName());

}

将产生以下输出(当我转动手机方向时):

E/SaveInstanceState﹕ onSaveInstanceState Bundle 1110617176 MainActivity
E/SaveInstanceState﹕ onCreate Bundle 1110617176 MainActivity

相同的 Bundle,因此我可以轻松地传递和恢复数据。

但在 fragment 中,这段代码:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState!=null)Log.e("SaveInstanceState", "onCreate Bundle " + savedInstanceState.hashCode()+" " + this.getClass().getSimpleName());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater,container, savedInstanceState);
if(savedInstanceState!=null)Log.e("SaveInstanceState", "onCreateView Bundle " + savedInstanceState.hashCode()+" " + this.getClass().getSimpleName());
return inflater.inflate(R.layout.fragment_b, container, false);
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e("SaveInstanceState", "onSaveInstanceState Bundle " + outState.hashCode()+" " + this.getClass().getSimpleName());

}

此输出结果:

E/SaveInstanceState﹕ onSaveInstanceState Bundle 1110622064 FragmentB
E/SaveInstanceState﹕ onCreate Bundle 1110623448 FragmentB
E/SaveInstanceState﹕ onCreateView Bundle 1110623448 FragmentB

onSaveInstanceState Bundle 和 onCreate 不同,因此我丢失了存储在 onSaveInstanceState Bundle 中的数据。

你知道我做错了什么吗?

更新

好的,谢谢@Sascha Kolberg,Bundle Hashcode 不同的事实并不意味着 Bundle 是空的。那么问题就变成了:

为什么我无法从 Fragment onCreate Bundle 检索我的数据?

这就是我所做的:

    public class FragmentB extends Fragment {

public static final String USER_TEXT = "user_text";
EditText userText;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View layout = inflater.inflate(R.layout.fragment_b, container, false);
userText = (EditText) layout.findViewById(R.id.userText);

if (savedInstanceState != null) {
Log.e("SaveInstanceState",
"onCreateView savedInstanceState " + savedInstanceState + " " + this.getClass().getSimpleName());
Log.e("SaveInstanceState",
"onCreateView savedInstanceState.getString(USER_TEXT) " + savedInstanceState.getString(USER_TEXT) +
" " + this.getClass().getSimpleName());
userText.setText(savedInstanceState.getString(USER_TEXT));
}
return layout;
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState = new Bundle();
outState.putString(USER_TEXT, String.valueOf(userText.getText()));
Log.e("SaveInstanceState", "onSaveInstanceState outState " + outState + " " + this.getClass().getSimpleName());
Log.e("SaveInstanceState",
"onSaveInstanceState outState.getString(USER_TEXT) " + outState.getString(USER_TEXT) + " " +
this.getClass().getSimpleName());
}
}

现在,我打开手机,写下“你好!”在 EditText 中,然后清除 logcat,并将手机的方向从纵向更改为横向。

输出如下:

E/SaveInstanceState﹕ onSaveInstanceState outState Bundle[{user_text=Hello! }] FragmentB
E/SaveInstanceState﹕ onSaveInstanceState outState.getString(USER_TEXT) Hello! FragmentB
E/SaveInstanceState﹕ onCreateView savedInstanceState Bundle[{android:view_state={2131492945=TextView.SavedState{423430e0 start=5 end=5 text=Hello! locale=fr-FR}}}] FragmentB
E/SaveInstanceState﹕ onCreateView savedInstanceState.getString(USER_TEXT) null FragmentB

旋转手机后EditText为空。我想我可以通过执行以下操作来检索数据:

SparseArray p=savedInstanceState.getSparseParcelableArray("android:view_state");

在 onCreate 方法中,但这看起来真的很复杂。

有什么想法吗?

最佳答案

Activity outState Bundle 还包含其子 fragment 的所有状态。

因此,当 bundle 在 onSaveInstanceState() 中传递一个 fragment 时,它可能会在之后传递它的同级 fragment ,并且在“onCreate()”中包含的不仅仅是它自己的状态。

关于android - 为什么 onCreate Bundle 和 onSaveInstanceState Bundle 在 Fragment 中不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32295978/

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