我发现这是一个非常令人困惑的问题(在Android领域散落的众多问题之一)。
setArguments()
对于 Android 非常无用的需求,即为 Fragments 提供无参数构造函数,这是一种解决方法。
我的困惑一波接一波地袭来。首先,您在 (例如 , ) 中自然重写的方法会收到一个参数,该参数表示 .此实例状态显然与您通过 存储和检索的值没有任何关系。两者都使用 ,两者都可能在同一个被覆盖的方法中访问,两者彼此之间没有任何关系。Fragment
onCreate
onCreateView
Bundle
savedInstanceState
Fragment
setArguments()
getArguments()
Bundle
Bundles
其次,目前尚不清楚Android如何使用.Android调用您的无参数构造函数以在旋转时重建您的构造函数,但显然也会调用构造时上次调用的任何方法。setArguments()
Fragment
setArguments()
Fragment
哼????
令人惊叹,但确实如此。所有这些疯狂的创造都是为了弥补对无参数构造函数的需求。Bundles
setArguments()
Fragment
简而言之,我正在使用静态方法来创建我的.newInstance
Fragment
public MyFragment() {
//satisfy Android
}
public static MyFragment newInstance(long record_id) {
Log.d("MyFragment", "Putting " + record_id + " into newInstance");
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putLong("record_id", record_id);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* Perform an immediate check of arguments,
* which ARE NOT the same as the bundle used
* for saved instance state.
*/
Bundle args = getArguments();
if(args != null) {
record_id = args.getLong("record_id");
Log.d("MyFragment", "found record_id of " + String.valueOf(record_id));
}
if(savedInstanceState != null) {
//now do something with savedInstanceState
}
}