Android 在片段中重写setArguments()

Android 在片段中重写setArguments(),android,android-fragments,Android,Android Fragments,我知道向片段传递参数的推荐方法是使用静态方法,创建一个bundle并对片段调用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

我知道向片段传递参数的推荐方法是使用静态方法,创建一个bundle并对片段调用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");
}
这是基于在片段类中实现setArguments()的方式。如果这允许在片段重新创建时访问mArguments,那么这不应该应用于setArguments()调用中设置的其他变量吗


除了约定之外,两种方案是否都比另一种方案有优势?

您不应该有理由重写
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;
}
}

然后,您可以(非常干净地)调用:


通过这种方式,您可以避免覆盖android操作系统内置的某些内容所带来的意外副作用—无论何时,您都应该强烈质疑这些问题。

一旦调用设置参数的超级实现,您就可以保持模式的完整性。

我的问题与其说是关于清洁度,不如说是关于后果。我想知道是否有人知道重写该方法的意外副作用,我理解这可能是一个很难回答的问题。只要确保遵循该方法的原始意图,就不会产生任何后果。我想了解的真正的一点是,你不应该为了实现你想要做的事情而重写它。此外,以您建议的方式重写设置参数确实违反了坚实的原则-更改设置参数的调用方可能导致需要更改基本方法,这可能会导致意外后果的连锁反应。
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
}