我总是创建片段并使用newInstance()模式将我的参数传递给片段。这适用于一个或两个参数。我现在正在创建一个包含大约10个参数的片段,所有这些参数都是可选的。
我正在考虑使用Builder模式,类似于AlertDialog的工作方式。但是,我不确定实现这个的最佳方法是什么,或者它是否是一个好主意。
这是我正在思考的一个例子,但有更多的变量。
public class MyFragment extends Fragment {
private String name;
private static class Builder {
private String name;
public Builder setName(String name) {
this.name = name;
return this;
}
public MyFragment build() {
return new MyFragment(this);
}
}
// NOT ALLOWED
public MyFragment(Builder builder) {
name = builder.name;
}
// Rest of the fragment...
}
这个问题是片段必须有一个默认的构造函数,所以这不起作用。
是否有“正确”的方法来实现这一目标?
答案 0 :(得分:5)
在Builder
build()
中,您可以执行以下操作:
public MyFragment build() {
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.put(ARG_1_TAG, this.arg1);
...
fragment.setArguments(bundle);
return fragment;
}
这样做的好处是可以为您的实例提供参数集,但不需要额外的newInstance()
方法。
答案 1 :(得分:2)
你应该留下公共的空构造函数。
建造者样本:
public class MyFragment extends Fragment {
private String name;
public static class Builder {
private final Bundle arguments;
public Builder() {
arguments = new Bundle();
}
public Builder setName(String name) {
arguments.putString("name", name);
return this;
}
public MyFragment build() {
MyFragment fragment = new MyFragment();
fragment.setArguments(arguments);
return fragment;
}
}
public MyFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
name = getArguments().getString("name");
}
}