10

Tôi có một Activity và sáu khác nhau Fragments gắn liền với nó. Mỗi đoạn có giao diện và hoạt động OnFragmentInteractionListener thực hiện tất cả các trình nghe này để nhận các cuộc gọi lại. Nó trông hơi lộn xộn, vì vậy tôi quan tâm là có một số mẫu/cách để đơn giản hóa điều này và làm cho thanh lịch hơn?Làm cách nào để xử lý nhiều trình lắng nghe tương tác phân đoạn trong một Hoạt động đúng cách?

Trả lời

17

Một giải pháp tốt có thể sử dụng SAME OnFragmentInteractionListener cho tất cả các phân đoạn và sử dụng một tham số của từng phương pháp nghe (như tham số TAG) để xác định phân đoạn nào đã gửi hành động.

đây một ví dụ:

Tạo một lớp mới và mỗi đoạn sử dụng lớp này

OnFragmentInteractionListener.java

public interface OnFragmentInteractionListener { 
    public void onFragmentMessage(String TAG, Object data); 
} 

Trong hoạt động của bạn:

public void onFragmentMessage(String TAG, Object data){ 
    if (TAG.equals("TAGFragment1")){ 
     //Do something with 'data' that comes from fragment1 
    } 
    else if (TAG.equals("TAGFragment2")){ 
     //Do something with 'data' that comes from fragment2 
    } 
    ... 
} 

Bạn có thể sử dụng Loại đối tượng để chuyển mọi loại dữ liệu mà bạn muốn (sau đó, bao giờ hết y nếu, bạn phải chuyển đổi Object để gõ đó là cần thiết).

Sử dụng cách này, việc bảo trì dễ dàng hơn 6 trình nghe khác nhau và phương pháp cho mọi loại dữ liệu bạn muốn chuyển.

Hy vọng điều này sẽ hữu ích.

5

nỗ lực của tôi cải thiện neonamu's answer:

Bạn có thể định nghĩa một giao diện giống như đã nêu ở trên, nhưng một chung một

public interface OnListFragmentInteractionListener<T> { 

     void onListFragmentInteraction(String tag, T data); 
} 

Sau đó, trong hoạt động máy chủ, bạn có thể thực hiện nó đặc biệt cho các loại hình mà bạn muốn, hoặc như được đề xuất ở trên cho Đối tượng:

public class MyFragActivity implements OnListFragmentInteractionListener<Object> { 
    ... 

    @Override 
    public void onListFragmentInteraction(String tag, Object data) { 
      //do some stuff with the data 
    } 
} 

Bằng cách này khi bạn triển khai giao diện tùy thuộc vào nhu cầu của ứng dụng, có thể bạn có thể sử dụng lại giao diện này trong tình huống khác.

+1

Hoạt động như một sự quyến rũ. Cảm ơn rất nhiều! –

+0

Tôi đã tự hỏi tại sao bạn sử dụng @Override và người dùng Neonamu thì không. Cả hai có làm việc không? – Burkely91

+1

@ Burkely91 có nó sẽ làm việc mà không có nó.BUT Bạn nên sử dụng nó. chú thích ghi đè trong Java có nghĩa là kiểm tra/xác minh rằng bạn đang thực sự ghi đè bạn nghĩ bạn (nó sẽ báo cáo lỗi nếu bạn quên tham số chẳng hạn) mà không ghi đè bạn chỉ đơn giản là xác định phương thức mới với cùng một tên tham số khác nhau (thực hiện quá tải) và không triển khai giao diện – HenriqueMS

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