2014-04-15 20 views
9

Tôi cần truyền một số dữ liệu từ đoạn con đến đoạn mẹ mà tôi có thể đọc khi tôi quay lại đoạn gốc. Chi tiết:Android: Truyền dữ liệu từ phân đoạn con đến đoạn mẹ

Tôi có một FragmentActivity gọi FragmentParent. Từ FragmentParent tôi gọi FragmentChild như thế này:

FragmentChild fragmentChild = new FragmentChild(); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.replace(R.id.frl_view_container, fragmentChild); 
transaction.addToBackStack(null); 
ctransaction.commit(); 

Trong FragmentChild tôi đặt một giá trị chuỗi mà tôi cần phải vượt qua trở lại FragmentParent và sau đó tôi trở về FragmentParent.

String result = "OK"; 
getFragmentManager().popBackStack(); 

Cách tốt nhất/thích hợp để đọc chuỗi kết quả trong FragmentParent là gì?

Trả lời

39

các thành phần kiến ​​trúc Android giải pháp:

Trong trường hợp bạn đang sử dụng các thành phần kiến ​​trúc Android, nó có thể chia sẻ dữ liệu giữa tất cả Fragments của một Activity với một ViewModel. Đảm bảo ViewModelProviders sử dụng Activity ngữ cảnh để tạo ViewModels.

public class SharedViewModel extends ViewModel { 
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>(); 

    public void select(Item item) { 
     selected.setValue(item); 
    } 

    public LiveData<Item> getSelected() { 
     return selected; 
    } 
} 

public class MasterFragment extends Fragment { 
    private SharedViewModel model; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); 
     itemSelector.setOnClickListener(item -> { 
      model.select(item); 
     }); 
    } 
} 

public class DetailFragment extends Fragment { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class); 
     model.getSelected().observe(this, { item -> 
      // Update the UI. 
     }); 
    } 
} 

Non Android kiến ​​trúc thành phần giải pháp:

Bạn có thể sử dụng setTargetFragmentonActivityResult để đạt được điều này.

Set FragmentParent dụ như đoạn mục tiêu trên dụ FragmentChild ví dụ:

FragmentChild fragmentChild = new FragmentChild(); 
fragmentChild.setTargetFragment(this, FRAGMENT_CODE); 
FragmentTransaction transaction = getFragmentManager().beginTransaction(); 
transaction.replace(R.id.frl_view_container, fragmentChild); 
transaction.addToBackStack(null); 
transaction.commit(); 

Trong FragmentChild, bất cứ nơi nào bạn đang viện dẫn popBackStack, gọi onActivityResult trên Fragment bộ mục tiêu. Sử dụng Gói để chuyển dữ liệu bổ sung.

Intent intent = new Intent(); 
intent.putExtra(FRAGMENT_KEY, "Ok"); 
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent); 
getFragmentManager().popBackStack(); 

Quay lại FragmentParent, ghi đè lên phương thức mặc địnhHoạt động.

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == FRAGMENT_CODE && resultCode == Activity.RESULT_OK) { 
     if(data != null) { 
      String value = data.getStringExtra(FRAGMENT_KEY); 
      if(value != null) { 
       Log.v(TAG, "Data passed from Child fragment = " + value); 
      } 
     } 
    } 
} 
+1

Điều này đã hiệu quả nhưng tôi không thể cập nhật giao diện người dùng trong onActivityResult. bạn có thể giúp đỡ với điều này? –

+0

@ Mulimani: Tuyệt vời, Nó tiết kiệm thời gian của tôi. Cảm ơn Manish. – Shailesh

+0

@Farooq Arshed: Để cập nhật giao diện người dùng, bạn phải làm mới chế độ xem của mình, như, tôi đang sử dụng bộ điều hợp sau đó tôi chỉ thông báo cho bộ điều hợp của mình trong onActivityResult. Đó là nó. – Shailesh

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