从Activity设置Fragment参数

Pse*_*mer 0 android race-condition android-fragments

我想知道setArguments在实例化之后立即调用Fragment 是否会产生任何问题.

例如,假设我们有以下代码段:

Fragment myFragment = new CustomFragment();
Bundle args = new Bundle();
args.putBoolean("amIAnArg", true);
myFragment.setArguments(args);
Run Code Online (Sandbox Code Playgroud)

这段代码似乎工作得很好,虽然看起来代码应该创建一个竞争条件,因为Fragment的参数只能在onAttach调用方法之前设置.

以这种方式设置Fragment的参数是否有任何问题?

kco*_*ock 5

就像一个Activity,Fragments具有特定的生命周期,并且不像简单的Java对象那样"创建".提交时FragmentTransaction,它是异步的,不会立即附加或创建.它在主线程上排队等待以后发生.只有这样,经历其生命周期方法(例如onCreate(),onAttach()).

应该以这种方式设置参数,并且应该在提交之前这样做FragmentTransaction- 但是,您可以在提交事务之后立即执行此操作而不会产生任何不良影响.正如其他人所说,你正在做的是建议newInstance()的片段工厂方法[1].例如:

private static final String ARG_IS_ARG = "is_arg";

public static CustomFragment newInstance(boolean isArg) {
    CustomFragment result = new CustomFragment();
    Bundle args = new Bundle();
    args.putBoolean(ARG_IS_ARG, isArg);
    result.setArguments(args);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

[1] http://developer.android.com/reference/android/app/Fragment.html