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