我发现这是一个非常令人困惑的问题(许多乱七八糟的问题之一)。
setArguments()
是一种针对Android的非常无济于事的解决方法,该需求对于Fragments提供了无参数构造函数。
我的困惑波涛汹涌。首先,你在你的自然覆盖的方法Fragment
(例如onCreate
,onCreateView
)收到一个Bundle
表示该参数savedInstanceState
你的Fragment
。该实例的状态显然有NOTHING任何与你通过存储的值setArguments()
,并通过检索getArguments()
。两者都使用a Bundle
,都Bundles
可能在相同的重写方法中访问它们,两者之间没有任何关系。
其次,目前尚不清楚Android如何使用setArguments()
。Android会调用您的无参数构造函数来重新构建您Fragment
的旋转对象,但显然ALSO会调用构造setArguments()
时最后一次调用的方法Fragment
。
嗯???
太神奇了,但事实如此。所有这些疯狂创建Bundles
都是setArguments()
为了弥补对无参数Fragment
构造函数的需求。
简而言之,我正在使用staticnewInstance
方法创建我的Fragment
。
public MyFragment() {
}
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);
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) {
}
}
setArguments
从构造函数调用。