我发现这是一个非常令人困惑的问题(许多乱七八糟的问题之一)。
newInstance是针对Android的非常无济于事的解决方法,该需求对于可用于Fragments的无参数构造函数非常有用。
我的困惑波涛汹涌。 首先,您在newInstance中自然覆盖的方法(例如Fragment、Fragment)会收到一个Fragment参数,该参数代表Fragment中的savedInstanceState。该实例状态显然与您通过2550753304678761761存储并通过2550479304678761478检索的值无关。 如果使用Bundle,则两个Bundles都可能会在相同的覆盖方法中被访问,并且两者之间没有任何关系。
其次,尚不清楚Android如何使用newInstance。Android会在旋转时调用无参数构造函数来重建Fragment,但显然,ALSO会在构造Fragment时调用最后一次调用的Fragment方法。
咦????
很棒,但是真实。 所有这一切都导致newInstance陷入Fragment的疯狂状态,以弥补对无参数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
}
}