Android - 使用构建器模式创建片段?
Android - Create a fragment using the Builder Pattern?
我总是创建片段并使用 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...
}
这个问题是片段必须有一个默认的构造函数,所以这是行不通的。
是否有 "correct" 方法来完成此操作?
在您的 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()
方法。
您应该 public 留空构造函数。
建造者样本:
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");
}
}
我总是创建片段并使用 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...
}
这个问题是片段必须有一个默认的构造函数,所以这是行不通的。
是否有 "correct" 方法来完成此操作?
在您的 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()
方法。
您应该 public 留空构造函数。
建造者样本:
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");
}
}