从Activity设置Fragment参数

时间:2014-07-17 22:11:57

标签: android android-fragments race-condition

我想知道在实例化后立即在片段上调用setArguments会产生任何问题。

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

Fragment myFragment = new CustomFragment();
Bundle args = new Bundle();
args.putBoolean("amIAnArg", true);
myFragment.setArguments(args);

此代码似乎工作正常,但看起来代码应该创建竞争条件,因为Fragment的参数只能在调用onAttach方法之前设置。

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

3 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:1)

应该没有问题。我正在开展一个项目,在几个地方使用这种确切的格式。

此格式也在Android Developers示例项目中(找到'Arguments'):

http://developer.android.com/reference/android/app/Fragment.html

答案 2 :(得分:0)

与@kcoppock所说的类似,在大多数情况下,您将在UI线程上实例化Fragment,然后Android将您传递给UI线程上的Fragment的参数排队。 。没有竞争条件,因为操作是在同一个线程上的不同时间进行的。

有关更多信息,请查看有关活动和片段的博文:http://www.zerotohired.com/2015/02/passing-data-between-activities-and-fragments-in-android