3

我总是使用 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...
}

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

有没有“正确”的方法来做到这一点?

4

2 回答 2

6

在您Builder的 'sbuild()中,您可以执行以下操作:

public MyFragment build() {
     MyFragment fragment = new MyFragment();
     Bundle bundle = new Bundle();
     bundle.put(ARG_1_TAG, this.arg1);
     ...
     fragment.setArguments(bundle);
     return fragment;
}

这具有为您的实例提供参数集的优势,但无需额外的newInstance()方法。

于 2015-02-06T23:55:08.680 回答
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");
    }
}
于 2015-02-07T00:01:22.390 回答