在片段

时间:2015-10-19 17:45:14

标签: android android-fragments

我知道将参数传递给Fragments的推荐方法是使用静态方法创建一个bundle并在Fragment上调用setArguments()/ getArguments():

public static MyFragment newInstance(int arg1, int arg2) {
    Bundle b = new Bundle();
    b.putInt("key1", arg1);
    b.putInt("key2", arg2);
    MyFragment frag = new MyFragment();
    frag.setArguments(b);
}

public View onCreateView(....) {
    Bundle b = getArguments();
    memberVar1 = b.getInt("key1");
    memberVar2 = b.getInt("key2");
    .....
}

如果我错了,请纠正我,但似乎以下方法也适用,以后不需要调用getArguments():

@Override
public void setArguments(Bundle args) {
    memberVar1 = args.getInt("key1");
    memberVar2 = args.getInt("key2");
}

这是基于在Fragment类中实现setArguments()的方式。如果这允许在Fragment重新创建的情况下访问mArguments,那么不应该同样适用于setArguments()调用中设置的其他变量吗?

659     public void setArguments(Bundle args) {
660         if (mIndex >= 0) {
661             throw new IllegalStateException("Fragment already active");
662         }
663         mArguments = args;
664     }

除了惯例之外,两种情况都有优势吗?

2 个答案:

答案 0 :(得分:0)

您不必覆盖setArguments(...)方法的原因......以下是您采取清理措施的可行方法。传递的论据。

创建一个新类,例如MyFragmentArguments.java

public class MyFragmentArguments {
public long keyOne;
public long keyTwo;

public MyFragmentArguments(long keyOne, long keyTwo) {
    this.keyOne = keyOne;
    this.keyTwo = keyTwo;
}

public MyFragmentArguments(Bundle bundle) {
    this.keyOne = bundle.getLong("KEY_ONE");
    this.keyTwo = bundle.getLong("KEY_TWO");
}

public Bundle toBundle() {
    Bundle args = new Bundle();
    args.putLong("KEY_ONE", keyOne);
    args.putLong("KEY_TWO", keyTwo);

    return args;
}

}

然后,你可以(非常干净地)打电话:

final MyFragmentArguments arguments = new MyFragmentArguments (getArguments());

if(arguments != null) { 
    // do something with arguments.keyOne & arguments.keyTwo
}

通过这种方式,您可以避免覆盖安装在Android操作系统中的内容的意外副作用 - 无论何时您都应该强烈质疑。

答案 1 :(得分:-1)

一旦调用了setArguments的超级实现,就可以保持模式的完整性。