2011-09-06 29 views
19

Đây là câu hỏi thiết kế, chứ không phải là câu hỏi kỹ thuật.Android: cách nhảy đúng giữa các đoạn

Trường hợp chung: Tôi muốn có sự kiện giao diện người dùng trong Phân đoạn để thực hiện thay đổi trong toàn bộ hoạt động.

Trường hợp cụ thể: Tôi có hai đoạn, được lưu trữ trong cùng một hoạt động. Khi người dùng nhấp vào một nút trong một trong những đoạn đó, tôi muốn nó được thay thế bằng phần còn lại.

I không muốn, tuy nhiên, Phân đoạn của tôi chạm vào hoạt động của tôi. Tôi có thể muốn thay đổi hành vi sau này (có thể, trong một màn hình lớn hơn, hiển thị cả hai mảnh thay vì thay thế đầu tiên), và tôi không muốn mã Fragment của tôi có logic đó.

Điều tôi đã làm là triển khai lớp Listener trong các đoạn của tôi, báo cáo sự kiện quay lại Activity. Bằng cách này, nếu tôi muốn sử dụng một lớp học Activity khác với hành vi hiển thị khác nhau, tôi chỉ có thể thay đổi người nghe và để mã Fragment bị ảnh hưởng.

Đây có phải là cách hay để thực hiện không? Có một thực hành tốt tiêu chuẩn, hoặc một mẫu thiết kế tốt hơn?

Trả lời

12

Sử dụng trình nghe là cách được khuyến nghị để liên lạc giữa Phân đoạn và hoạt động của bạn.

Xem số Android documentatin section này để biết thông tin. Dài câu chuyện ngắn họ chỉ cần thực hiện một giao diện người nghe của lớp Activity và cast getActivity() dẫn đến một đoạn cho một người nghe.

Từ kinh nghiệm cá nhân của tôi điều này rất thuận tiện vì cho phép bạn:

  1. easilly chuyển hoạt động cơ bản (ví dụ bạn lưu trữ toàn bộ đoạn trong một hoạt động wrapper để tương thích trong pre-3.0 và lưu trữ đoạn này cùng với những người khác trong 11+)
  2. Kiểm soát dễ dàng nếu hoạt động của trình bao bọc có hỗ trợ gọi lại hay không. Chỉ cần kiểm tra là nó thực hiện người nghe và làm hành động cụ thể ứng dụng của bạn nếu nó không.
2

Bạn đang nói đúng về việc sử dụng Trình nghe. Đây là điều tôi cũng phải đối phó trong một dự án tại nơi làm việc. Cách tốt nhất để xử lý nó là làm cho Fragment độc lập trong tự nhiên. Bất cứ điều gì có nhu cầu tương tác với Fragment nên sử dụng API công cộng của nó và/hoặc thiết lập người nghe cho các sự kiện cụ thể. Nếu bạn đã quen thuộc với Design Patterns, đây là Observer pattern. Các sự kiện có thể nói chung hoặc cụ thể cũng như chứa dữ liệu hoặc không có dữ liệu.

Ví dụ về dự án của tôi, tôi đã có hai Phân đoạn. Một ListFragment và một InfoFragment hiển thị ListItem đã chọn. ListFragment đã có một giao diện Listener cho Activity của tôi để nối vào, nhưng InfoFragment không phải là Fragment cơ bản của bạn. Tôi đã thêm một giao diện Listener vào InfoFragment sẽ được thông báo khi Fragment muốn đóng. Đối với Fragment, điều này có thể là do một nút bấm, hoặc hành động cụ thể đã xảy ra, nhưng theo như hoạt động của tôi là có liên quan, khi sự kiện được kích hoạt, nó sẽ đóng lên khung nhìn Fragment.

Đừng ngại sử dụng nhiều Người nghe cho Phân đoạn, nhưng cũng cố gắng nhóm chúng theo một hành động cụ thể bằng cách sử dụng các tham số dữ liệu để cá nhân hóa chúng. Hi vọng điêu nay co ich!

+1

Tôi đang gặp phải sự cố tương tự. Tôi đã có một FragmentActivity quản lý thông qua listhost 4 tabhost và mọi ListFragment có thể, dựa trên tương tác người dùng, khởi chạy các mảnh khác (Tất cả các mảnh chia sẻ cùng một bố trí nơi nội dung của chúng được hiển thị). Mô hình gọi lại có hợp lệ không? cảm ơn – Blackbelt

+1

Có, mẫu Gọi lại sẽ hoàn hảo cho việc này. Cho phép Hoạt động khởi chạy bằng cách lắng nghe tất cả các đoạn – Spidy

0

Một câu trả lời kỹ thuật cho:

Tôi có hai mảnh, tổ chức trong hoạt động tương tự. Khi người dùng nhấp vào một nút trong một trong những đoạn đó, tôi muốn nó được thay thế bằng phần còn lại.

FragmentTransaction ft = this.getFragmentManager().beginTransaction(); 
    Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName()); 
    ft.replace(android.R.id.content, mFragment); 
    ft.commit(); 
0
public class Example_3_Mainfile extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);   
     setContentView(R.layout.example_3_mainfile); 

       Fragment fr ;//make class that extend to thefragment 
       fr = new Act_2_1();     
        FragmentManager fm = getFragmentManager(); 
        FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
        fragmentTransaction.replace(R.id.fragment_place, fr); 
        //id get of fragment tag from xml file there decelar 
        fragmentTransaction.commit(); 
        } 
    } 
Các vấn đề liên quan