2014-07-17 34 views
0

我想知道如果在其实例化后立即调用setArguments创建任何问题。设置活动的片段参数

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

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

此代码似乎做工精细,虽然它看起来像代码应该创造竞争条件,因为一个片段的参数只能前设置调用onAttach方法。

以这种方式设置片段参数是否存在问题?

+0

@codeMagic是的,这是一个错字。谢谢! –

+2

这正是你设置参数的原因,因为当你将它提交给事务时创建了这个片段,而不是在何时创建它的一个实例 – tyczj

+0

这不是一个真正的竞争条件,因为onAttach()不会被调用,直到你...好,将片段附加到Activity(启动事务,调用show()或replace()等)。至少对我的理解 – Shadesblade

回答

5

就像一个ActivityFragments有特定的生命周期,而不是“创造”一样简单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

+0

在'newInstance()'工厂方法中调用'setArguments()'也是我通常设置片段参数的方式。该文档让我断言''setArguments()'“只能在片段附加到其活动之前调用;也就是说,应该在构造片段后立即调用它。”我没有考虑到的是,即使在创建片段之后,我们仍然必须在片段附加到活动之前提交事务。谢谢! –