我知道将参数传递给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 }
除了惯例之外,两种情况都有优势吗?
答案 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的超级实现,就可以保持模式的完整性。