我发现这是一个非常令人困惑的问题(在Android领域散落的众多问题之一)。
setArguments()对于 Android 非常无用的需求,即为 Fragments 提供无参数构造函数,这是一种解决方法。
我的困惑一波接一波地袭来。首先,您在 (例如 , ) 中自然重写的方法会收到一个参数,该参数表示 .此实例状态显然与您通过 存储和检索的值没有任何关系。两者都使用 ,两者都可能在同一个被覆盖的方法中访问,两者彼此之间没有任何关系。FragmentonCreateonCreateViewBundlesavedInstanceStateFragmentsetArguments()getArguments()BundleBundles
其次,目前尚不清楚Android如何使用.Android调用您的无参数构造函数以在旋转时重建您的构造函数,但显然也会调用构造时上次调用的任何方法。setArguments()FragmentsetArguments()Fragment
哼????
令人惊叹,但确实如此。所有这些疯狂的创造都是为了弥补对无参数构造函数的需求。BundlessetArguments()Fragment
简而言之,我正在使用静态方法来创建我的.newInstanceFragment
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
    }
}