7

như tiêu đề cho biết, tôi đang cố gắng tìm ra cách nào là cách tốt nhất để tiêm phụ thuộc vào một Phân đoạn. Tôi muốn được độc lập từ khung bên ngoài như RoboGuice, vvPhân mảnh và phụ thuộc Android Injection

Bây giờ, trong cách đơn giản nhất có thể, tôi có một giao diện mà tóm tắt một số loại logic, và, từ một hoạt động, tôi muốn tiêm một thực hiện điều này giao diện. Tôi biết rằng tôi phải cung cấp một hàm tạo mặc định cho đoạn của tôi, vì hệ thống có thể cần tạo lại đoạn tại một thời điểm nào đó, và cách thông thường để tạo một thể hiện mới của đoạn là cung cấp phương thức tĩnh để xử lý việc tạo này:

public static Fragment newInstance() { 
    final Bundle bundle = new Bundle(); 
    ... 
    final Fragment fragment = new MyFragment(); 
    fragment.setArguments(bundle); 
    return fragment; 
} 

Làm cách nào để vượt qua sự phụ thuộc của tôi vào phân đoạn? Tôi có nên làm cho nó thực hiện các giao diện Parcelable hoặc Serializable và sau đó đóng gói nó trong Bundle? Có cách nào khác để đạt được kết quả không?

Cảm ơn!

Trả lời

0

Tại sao bạn không lấy sự phụ thuộc từ hoạt động của mình?

public void onActivityCreated(Bundle b){ 
    super.onActivityCreated(b) 
    DependencyClass c = ((MyActivity)getActivity()).getDependency(); 
} 
+1

Nếu tôi làm như thế này tôi sẽ kết thúc khớp nối Fragment đến Hoạt động phải không? Tôi vẫn muốn Fragment độc lập và có thể sử dụng lại được. – TheImplementer

7

Một giải pháp đơn giản là khai báo giao diện khai báo Phụ thuộc bắt buộc cho Phân đoạn. Sau đó, để cho Context of the Fragment triển khai thực hiện giao diện này và thăm dò các phụ thuộc khi cần từ Context.

hợp đồng:

public interface MyDependencies { 

    MyDep getDep(); 

} 

Hoạt động:

public MyActivity extends Activity implements MyDependencies { 

    @Override 
    public MyDep getDep(){ 
     return createMyDependencyOrGetItFromASingletonOrGetItFromApplication() 
    } 
} 

Fragment:

public void onActivityCreated(Bundle b){ 
    super.onActivityCreated(b) 

    if (getActivity() instanceOf MyDependencies) { 
     MyDep dep = ((MyDependencies) getActivity).getDep(); 
    } else { 
     throw new RuntimeException("Context does not support the Fragment, implement MyDependencies") 
    } 
} 

Vì vậy, trên thực tế, không có khớp nối không cần thiết cho Hoạt động vì hợp đồng được xác định bởi một giao diện.

0

Nếu bạn không thể vượt qua trong sự phụ thuộc qua các nhà xây dựng (nếu bạn cần một constructor mặc định), và bạn không muốn sử dụng một lib dependency injection như Dagger hoặc RoboGuice, cách cổ điển khác là một setter để "tiêm" sự phụ thuộc.

Fragment MyFragment { 

Depend mDepend; 

.... 


    public void setDepend(Depend depend) { 
     mDepend = depend; 
    } 

} 

Sau đó, trong hoạt động của bạn, bạn có thể tiêm phụ thuộc vào phương thức onCreate.

nên một cái gì đó như thế này trong hoạt động của bạn:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 
    MapFragment wrapperFragment = new WrapperFragment(); 
    if (savedInstanceState == null) { 
     getFragmentManager().beginTransaction() 
       .add(R.id.map_container, wrapperFragment).commit(); 
    // find the fragment 
    // call the setter 
    } 
} 
+0

Vấn đề với giải pháp này là khi android tái tạo mảnh, nó sử dụng hàm tạo mặc định và không gọi phương thức set, mặc dù chúng đã được gọi trước đó. – FacundoJ

Các vấn đề liên quan