2016-04-19 17 views
16

Tôi có hoạt động với 3 đoạn, hiện tại tôi đang sử dụng ViewPager. Tôi muốn thực hiện MVP và giao tiếp giữa người dẫn chương trình hoạt động và đoạn thuyết trình tức là:Android MVP - Cách liên lạc giữa người trình bày hoạt động và người trình bày phân đoạn

  • Passing dữ liệu từ người dẫn chương trình hoạt động để thuyết trình đoạn
  • Gửi sự kiện từ người trình bày đoạn để dẫn chương trình hoạt động
  • ...

Nhưng tôi không biết cách làm theo cách chính thức. Tôi có thể sử dụng BusEvent nhưng tôi không nghĩ đó là một thực hành tốt.

+0

Bạn có thể cung cấp thêm chi tiết về trường hợp sử dụng của mình không? vì có một số câu trả lời có thể có trong các trường hợp sử dụng khác nhau như: tạo quy tắc nghiệp vụ chung, sử dụng tiêm phụ thuộc, sử dụng bus sự kiện, chuyển bó tới các đoạn của bạn, v.v. –

+0

Bạn có thể đề cập các ví dụ về dữ liệu/sự kiện mà bạn muốn chuyển giữa các diễn giả ? Bạn có phải là nguồn dữ liệu chung không? – elmorabea

Trả lời

0

Theo hiểu biết của tôi, cho UseCase của bạn, giả sử ActivityA có một viewPager có 3 Phân đoạn (FragmentA, FragmentB, FragmentC).

ActivityA có ActivityPresenterA

FragmentA có FragmentPresenterA

Theo MVP, FragmentPresenterA phải chịu trách nhiệm cho tất cả các dòng hợp lý và kinh doanh của FragmentA chỉ và cần liên lạc với chỉ FragmentA. Do đó, FragmentPresenterA không thể giao tiếp trực tiếp với ActivityPresenterA.

Để liên lạc từ Phân đoạn thành Hoạt động, người trình bày không nên tham gia và điều này nên được thực hiện vì chúng tôi sẽ liên lạc với kiến ​​trúc phi MVP, tức là với sự trợ giúp của giao diện.

Tương tự áp dụng cho liên lạc Hoạt động với Phân đoạn.

Đối với thông tin liên lạc giữa các hoạt động và Fragment đọc here

+0

Cách tiếp cận này có sạch không? Điều gì sẽ xảy ra nếu những đoạn này chỉ liên quan đến dữ liệu? Điều này có nên được thực hiện khác trong trường hợp này không? – kkkkk

+0

Nếu tất cả các mảnh của ViewPager có liên quan với nhau với dữ liệu hoặc chia sẻ dữ liệu chung, trong trường hợp đó, Fragments không cần phải có người trình bày khác nhau. ActivityPresenter sẽ xử lý tất cả các logic nghiệp vụ của các đoạn này và truyền dữ liệu đến các đoạn tương ứng sự trợ giúp của giao diện. – nnn

0

Bạn có thể sử dụng một người dẫn chương trình cho trường hợp đó.

Sử dụng Trình hiển thị hoạt động của bạn để nhận tất cả dữ liệu mà các đoạn của bạn cần. sau đó tạo một lớp giao diện và triển khai nó cho các đoạn của bạn.

Ví dụ:

Tạo một giao diện nào cho bạn PageAFragment (giao diện này sẽ cầu dữ liệu của bạn từ hoạt động để phân mảnh). và sử dụng phương thức giao diện của bạn để xử lý kết quả từ người trình bày của bạn để xem.

Đây là ví dụ về lớp giao diện mà tôi đã tạo cho dữ liệu nhận được. cho các tham số bạn có thể chọn những gì bạn muốn nó phụ thuộc vào nhu cầu của bạn, nhưng đối với tôi tôi chọn mô hình.

public interface CallbackReceivedData { 
    void onDataReceived(YourModel model); 
} 

Trong MainActivity Lớp kiểm tra trường hợp của đoạn đó gắn vào hoạt động của bạn. đặt ví dụ kiểm tra của bạn sau khi bạn cam kết phân đoạn.

public class MainActivity extends AppCompatActivity{ 

    private CallbackReceivedData callbackReceivedData; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //after commit the fragment 
    if (fragment instanceof PageAFragment){ 
      callbackReceivedData = (CallbackReceivedData)fragment; 
    } 

    } 
    //this is the example method of MainActivity Presenter, 
    //Imagine it, as your view method. 
    public void receivedDataFromPresenter(YourModel model){ 
     callbackReceivedData.onDataReceived(model); 
    } 

} 

Tôi giả định rằng receivedDataFromPresenter là phương pháp nhận của điểm của chúng tôi và nhận được dữ liệu để trình bày.

Và bây giờ chúng ta sẽ vượt qua các dữ liệu từ người dẫn chương trình để callbackReceivedData

Trong PageAFragment thực hiện CallbackReceivedData và Ghi đè onDataReceived phương pháp. Bây giờ bạn có thể chuyển dữ liệu từ hoạt động sang phân đoạn của bạn.

public class PageAFragment extends Fragment implements CallbackReceivedData{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public void onDataReceived(YourModel model) { 

    } 
} 

Lưu ý: Cách khác, bạn có thể sử dụng Gói và chuyển dữ liệu bằng cách sử dụng setArguments.

Nếu bạn muốn gửi sự kiện từ Phân đoạn đến hoạt động bạn có thể thực hiện theo ý tưởng này.

Tạo một lớp Giao diện và triển khai lớp đó vào MainActivity và ghi đè phương thức từ giao diện đến hoạt động của bạn, đối với trường hợp của tôi, tôi làm như thế này.

Đây là số CallbackSendData Class của tôi.

public interface CallbackSendData { 
    void sendDataEvent(String event); 
} 

Thực hiện CallbackSendData giao diện để bạn MainActivity và Ghi đè sendDataEvent phương pháp.

public class MainActivity extends AppCompatActivity implements CallbackSendData{ 

    private CallbackReceivedData callbackReceivedData; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    //after commit the fragment 
    if (fragment instanceof PageAFragment){ 
     callbackReceivedData = (CallbackReceivedData)fragment; 
    } 

    } 

    //this is the example method of MainActivity Presenter, 
    //Imagine it, as your view method. 
    public void receivedDataFromPresenter(YourModel model){ 
     callbackReceivedData.onDataReceived(model); 
    }  


    @Override 
    public void sendDataEvent(String event){ 
    //You can now send the data to your presenter here. 
    } 



} 

Và để PageAFragment bạn bạn cần phải sử dụng phương pháp đính kèm để cast giao diện của bạn. Phương thức đính kèm được gọi khi phân đoạn được liên kết với hoạt động của nó. Nếu bạn muốn hiểu vòng đời của mảnh chỉ cần nhấp vào liên kết này: https://developer.android.com/reference/android/app/Fragment.html.

public class PageAFragment extends Fragment implements CallbackReceivedData{ 

    private CallbackSendData callbackSendData; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


    } 

    @Override 
    public void onDataReceived(YourModel model) { 
     //Received the data from Activity to Fragment here. 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
    container, @Nullable Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.PagerAFragment, container, 
    false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle 
    savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     Button Eventbutton; 

     Eventbutton = view.findViewById(R.id.event_button); 
     Eventbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       callbackSendData.sendDataEvent("send Data sample"); 
      } 
     }); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try{ 
      callbackSendData = (CallbackSendData) context; 
     }catch (ClassCastException e){ 
      e.printStackTrace(); 
     } 
    } 

}

Và bây giờ bạn có thể sử dụng CallbackSendData để gửi dữ liệu từ hoạt động cho đoạn.

Lưu ý: Sẽ dễ dàng hơn nhiều nếu bạn đang sử dụng Dependency Injection cho dự án của mình, bạn có thể sử dụng thư viện Dagger2.

Goodluck.

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