2015-02-06 34 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"); 
    } 
} 
相關問題