2016-04-05 15 views
6

Tôi có một số Activity và 5 Fragment. Trên số điện thoại đầu tiên Fragment người dùng nhập số điện thoại. Vào ngày cuối cùng (thứ năm) Fragment Tôi cần hiển thị số điện thoại này, nhập các trường khác và gửi tất cả dữ liệu đến máy chủ. Đối với mỗi Fragment tôi đang sử dụng Trình dẫn riêng (MVP).Dữ liệu chuyển qua Android giữa các Mảnh vỡ

Cách chuyển dữ liệu từ đoạn đầu tiên đến cuối cùng?

1) Tôi không muốn vượt qua tất cả các chuỗi phân đoạn, vì chúng không cần dữ liệu này.

2) Nếu lưu trữ dữ liệu này trong lưu trữ Activity, tôi cần gọi ((SomeActivity)getActivity()).getUserData() bên trong Fragment và chuyển dữ liệu này cho Người trình bày.

3) Tôi đã chọn cách tiếp cận cuối cùng. Tôi đã tạo một lớp UserData singleton. Đây là lớp POJO đơn giản. Tôi đang tạo phiên bản UserData trong Fragment thiết lập dữ liệu cần thiết đầu tiên và sử dụng dữ liệu đó trong Fragment cuối cùng để truy xuất dữ liệu và thêm các trường bị thiếu.

Nhưng tôi không biết là cách tiếp cận với giải pháp đúng singleton. Bởi vì tôi cần phải xóa singleton instance khi người dùng đi đến một Activity khác. Nếu có giải pháp tốt hơn?

EDIT

Tôi nghĩ về EventBus. Nhưng tôi sẽ phải chuyển dữ liệu từ Fragment đến Presenter. Bây giờ tôi gọi UserData.getInstance() bên trong hiện tại và truy xuất dữ liệu. Tôi muốn mã được thanh lịch hơn và cũng chính xác. Tôi yêu cầu nghe ý kiến ​​của các nhà phát triển có kinh nghiệm hơn những gì tốt hơn để sử dụng.

+0

Bạn không thể sử dụng 'SharedPref'? –

+0

@RohitArya Tôi không nghĩ rằng đây là giải pháp tốt hơn là giữ dữ liệu bên trong Hoạt động. Tôi chỉ cần dữ liệu này để gửi đến máy chủ, không phải trong thời gian dài –

+0

Sau đó singleton sẽ là một cách tiếp cận tốt. –

Trả lời

2

tôi sẽ làm điều đó một cách ModellViewPresenter

class CustomerModel { 
    String phoneNumber 
} 

interface ICustomerOwner { 
    CustomerModel getCustomer() 
} 

class CustomerRegistrationWorkflowActivity extends Activity implements ICustomerOwner { 
    CustomerModel getCustomer() 
    ... 
} 

class CustomerContactDataFragment // fragment1 where you edit the phone number. 

class CustomerRegistrationSummaryFragment // fragment5 showing all data plus submit button) 

Kể từ khi mô hình sống trong (CustomerRegistrationWorkflow) Hoạt động các mảnh vỡ có thể giao tiếp với mô hình bằng cách gọi

((ICustomerOwner) getActivity()).getCustomer() 
2

Có rất nhiều cách để gửi dữ liệu từ một lớp (Phân đoạn) đến một lớp khác.

Xem xét các vấn đề về vòng đời của Fragment. Bạn có thể sử dụng một Event bus cho cùng một sự kiện mà không có bất kỳ phức tạp nào.

class FragmentA { 
    Bus bus; 

    onCreate(){ 
     bus = new Bus(); 
    } 

    @Subscribe public void receiveMessage(String message) { 
     // TODO: Parse your message 
    } 

    onResume(){ 
     bus.register(this); 
    } 

    onPause(){ 
     bus.unregister(this); 
    } 
} 

class FragmentB { 

    onCreate(){ 
     bus.post("You have a message"); 
    } 
} 

Thông tin thêm về tích hợp otto here. Hoặc có rất nhiều lựa chọn khác. https://greenrobot.github.io/EventBus/

+0

Tôi đã nghĩ về EventBus. Nhưng tôi đã viết bình luận cho câu hỏi của tôi. Tôi sẽ phải chuyển dữ liệu từ 'Fragment' đến người trình bày. Bây giờ tôi gọi 'UserData.getInstance()' bên trong hiện tại và lấy dữ liệu. Tôi muốn mã thanh lịch hơn và cũng chính xác –

+2

Nếu bạn có thứ gì đó. Thêm nó vào câu hỏi của bạn. Làm thế nào để bạn mong đợi một số để sẵn sàng câu hỏi của bạn và ý kiến ​​của bạn để đưa ra một câu trả lời? – amalBit

+0

Tôi đã cập nhật qestion của mình –

0

Một đoạn luôn được kết nối với Hoạt động chứa nó. Vì vậy, nó có thể giao tiếp dễ dàng với Hoạt động. Sử dụng Hoạt động của bạn làm kênh để giao tiếp hoặc phương tiện giao tiếp, bạn có thể tạo liên kết giao tiếp giữa các Phân đoạn được đính kèm với cùng một Hoạt động.

Một đoạn kết nối với Hoạt động có thể truy cập cá thể Hoạt động bằng phương thức getActivity() và với cá thể này, đoạn có thể thực hiện các tác vụ như gọi phương thức của Hoạt động.

Bây giờ, để truyền dữ liệu từ Phân đoạn này sang Phân đoạn khác, bạn có thể tạo phương thức trong Hoạt động và lưu trữ một số dữ liệu trong một biến thông qua phương thức đó. Và trong đoạn khác, bạn có thể truy cập giá trị của biến đó bằng cách trợ giúp phương thức khác. Khái niệm về các phương thức getter và setter có thể được sử dụng ở đây.

Để biết thêm về hoạt động và giao tiếp Fragment của, hãy truy cập vào liên kết: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

1

Một kêu gọi giải pháp thanh lịch bằng xe buýt trường hợp, người kia - cũ callbacks tốt. Quan điểm của tôi là tránh tình trạng "chuỗi mảnh vỡ" - khi một đoạn trực tiếp gọi một đoạn khác. Nếu hoạt động xử lý hoàn toàn các mảnh thay thế, nó có quyền truy cập bình đẳng vào tất cả 5 đoạn. Do đó, nó có thể dễ dàng chuyển dữ liệu giữa chúng bằng cách sử dụng gọi lại.

Không thấy bất kỳ sự cố nào với MVP trong trường hợp đó. Người trình bày sử dụng gọi lại để gửi dữ liệu đến chế độ xem của nó (Phân đoạn). Fragment sử dụng gọi lại để gửi dữ liệu đến Activity của nó. Hoạt động sau đó tìm mảnh thứ 5 trong trình quản lý phân đoạn và cập nhật/truyền dữ liệu trong đoạn thứ 5.

Tình huống gọi lại có vẻ mạnh mẽ hơn xe buýt sự kiện, nhưng vẫn quan trọng về hương vị.

0

Tôi đã có rất nhiều các vấn đề về việc chuyển dữ liệu thành trọng lực hoặc đoạn. Kết quả là, tôi đã thực hiện DataCache vượt qua bất kỳ đối tượng bất cứ nơi nào.

đây là ví dụ siêu dễ dàng. Gihub : Android DataCache

Fragment cho Sender

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

     String msg = "the phone number" 
     DataCache.getInstance().push(msg); 
    } 
} 

Fragment cho Receiver

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

      String msg = DataCache.getInstance().pop(String.class); 
     } 
    } 

thử nó: D Tôi hy vọng bạn giúp đỡ.

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