2015-02-06 35 views
1

我一直创建片段,并使用newInstance()模式将我的参数传递给片段。这适用于一个或两个参数。我现在创建了一个具有大约10个参数的片段,并且它们都是可选的。Android - 使用Builder模式创建一个片段?

我正在考虑使用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... 
} 

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

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

回答

3

在你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()方法的需要。

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"); 
    } 
} 
相关问题