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" 方法来完成此操作?

在您的 Builderbuild() 中,您可以执行以下操作:

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");
    }
}