2011-07-19 35 views
61

Tôi hiện có một đoạn trong lớp phủ. Đây là để đăng nhập vào dịch vụ. Trong ứng dụng điện thoại, mỗi bước tôi muốn hiển thị trong lớp phủ là màn hình và hoạt động của riêng họ. Có 3 phần của quá trình đăng nhập và mỗi phần có hoạt động riêng của chúng được gọi với startActivityForResult().Có phương pháp nào hoạt động giống như đoạn bắt đầu cho kết quả không?

Bây giờ tôi muốn làm điều tương tự bằng cách sử dụng phân đoạn và lớp phủ. Lớp phủ sẽ hiển thị một đoạn tương ứng với từng hoạt động. Vấn đề là các mảnh này được lưu trữ trong một hoạt động trong API Honeycomb. Tôi có thể nhận được đoạn đầu tiên làm việc, nhưng sau đó tôi cần startActivityForResult(), điều này là không thể. Có một cái gì đó dọc theo dòng của startFragmentForResult(), nơi tôi có thể bắt đầu một mảnh mới và khi nó được thực hiện có nó trả lại một kết quả cho mảnh trước đó?

Trả lời

40

Tất cả các Phân đoạn sống bên trong Hoạt động. Bắt đầu một Fragment cho một kết quả không có ý nghĩa gì nhiều, bởi vì Activity hoạt động ở đó luôn có quyền truy cập vào nó và ngược lại. Nếu Fragment cần vượt qua kết quả, nó có thể truy cập vào Activity của nó và thiết lập kết quả của nó và hoàn thành nó. Trong trường hợp trao đổi Fragments trong một Activity duy nhất, Activity vẫn có thể truy cập được bởi cả hai Fragments, và tất cả các thông điệp của bạn có thể đi qua Activity.

Chỉ cần nhớ rằng bạn luôn có liên lạc giữa Phân đoạn và Hoạt động của nó. Bắt đầu và kết thúc với kết quả là cơ chế giao tiếp giữa các hoạt động - Các hoạt động sau đó có thể ủy thác bất kỳ thông tin cần thiết nào cho các mảnh vỡ của chúng.

+8

Ngoài ra khi tải một đoạn từ phân đoạn khác, bạn có thể đặt đoạn đích và gọi lại phương thức 'onActivityResult' của phân đoạn gốc nếu bạn muốn. – PJL

+2

Câu trả lời của bạn chưa hoàn chỉnh, các đoạn sử dụng vòng đời giống như các hoạt động. Vì vậy, chúng ta không thể đưa ra các đối số thông qua các phương thức nhưng chúng ta nên sử dụng các gói để truyền các giá trị. Ngay cả khi mảnh vỡ đặt giá trị ở đâu đó, chúng ta cần phải biết khi nào anh ta kết thúc. Nếu các mảnh trước có được giá trị khi nó bắt đầu/tiếp tục không? Đây là một ý tưởng. Nhưng không có cách thích hợp để lưu trữ giá trị, đoạn có thể được gọi bởi nhiều mảnh/hoạt động khác. – Loenix

45

Nếu bạn muốn, có một số phương pháp để liên lạc giữa mảnh vỡ,

setTargetFragment(Fragment fragment, int requestCode) 
getTargetFragment() 
getTargetRequestCode() 

Bạn có thể gọi lại sử dụng các.

Fragment invoker = getTargetFragment(); 
if(invoker != null) { 
    invoker.callPublicMethod(); 
} 
+5

Điều này có hoạt động ngay cả khi một mảnh được thay thế? – Ronnie

+0

Tôi chưa xác nhận, nhưng có thể nó hoạt động. vì vậy, bạn nên cẩn thận về rò rỉ bộ nhớ do tham chiếu vòng tròn do lạm dụng 'setTargetFragment()'. – nagoya0

+2

Giải pháp tốt nhất cho đến nay!Hoạt động tuyệt vời khi có một Hoạt động và một chồng các mảnh mà cố gắng tìm đúng đoạn để thông báo sẽ là một cơn ác mộng. Cảm ơn –

3

2 xu của tôi.

Tôi chuyển đổi các mảnh vỡ bằng cách hoán đổi một đoạn cũ bằng đoạn mới bằng cách sử dụng ẩn và hiện/thêm (hiện có/mới). Vì vậy, câu trả lời này là dành cho các nhà phát triển sử dụng các phân đoạn như tôi.

Sau đó, tôi sử dụng phương thức onHiddenChanged để biết rằng đoạn cũ đã được chuyển về từ phiên bản mới. Xem mã bên dưới.

Trước khi rời khỏi đoạn mới, tôi đặt kết quả trong một tham số chung được truy vấn bởi đoạn cũ. Đây là một giải pháp rất ngây thơ.

@Override 
public void onHiddenChanged(boolean hidden) { 
    super.onHiddenChanged(hidden); 
    if (hidden) return; 
    Result result = Result.getAndReset(); 
    if (result == Result.Refresh) { 
     refresh(); 
    } 
} 

public enum Result { 
    Refresh; 

    private static Result RESULT; 

    public static void set(Result result) { 
     if (RESULT == Refresh) { 
      // Refresh already requested - no point in setting anything else; 
      return; 
     } 
     RESULT = result; 
    } 

    public static Result getAndReset() { 
     Result result = RESULT; 
     RESULT = null; 
     return result; 
    } 
} 
+0

Phương thức 'getAndReset()' là gì? – EpicPandaForce

+0

Đã thêm mã bị thiếu (một phần của mã) để có ý nghĩa. –

1

Trong đoạn của bạn, bạn có thể gọi hàm getActivity(). Điều này sẽ cung cấp cho bạn quyền truy cập vào hoạt động đã tạo phân đoạn. Từ đó bạn có thể gọi phương thức tùy chỉnh của mình để đặt giá trị hoặc chuyển giá trị.

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