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 setTargetFragment và onActivityResult để đạ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);
}
}
}
}
Đ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? –
@ Mulimani: Tuyệt vời, Nó tiết kiệm thời gian của tôi. Cảm ơn Manish. – Shailesh
@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