Android - 使用Builder Pattern创建片段?

时间:2015-02-06 23:34:03

标签: android android-fragments 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...
}

这个问题是片段必须有一个默认的构造函数,所以这不起作用。

是否有“正确”的方法来实现这一目标?

2 个答案:

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