안드로이드 아키텍처 구성 요소 솔루션 : 당신이 안드로이드 아키텍처 구성 요소를 사용하는 경우
, 것이 가능 ViewModel
모든 Fragments
Activity
의 사이에서 데이터를 공유 할 수 있습니다. ViewModelProviders
이 Activity
컨텍스트를 사용하여 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.
});
}
}
비 안드로이드 아키텍처 구성 요소 솔루션 :
당신은 setTargetFragment 및 onActivityResult이를 달성하기 위해 사용할 수 있습니다. 사용자가 호출된다 popBackStack 목적지 FragmentChild에서는 FragmentChild 인스턴스 즉
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();
상의 목표 프래그먼트로서
세트 FragmentParent 인스턴스는 설정된 목표 조각에 onActivityResult를 호출한다. 번들을 사용하여 추가 데이터를 전달하십시오.
Intent intent = new Intent();
intent.putExtra(FRAGMENT_KEY, "Ok");
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
getFragmentManager().popBackStack();
FragmentParent로 돌아 가면 기본 onActivityResult 메서드를 재정의합니다.
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);
}
}
}
}
이것은 성공했지만 onActivityResult에서 UI를 업데이트 할 수 없습니다. 이걸로 도울 수 있니? –
@Manish Mulimani : 좋아요, 시간을 절약 해줍니다. 감사합니다 Manish. – Shailesh
@Farooq Arshed : UI 업데이트의 경우보기를 새로 고쳐야합니다. 예를 들어, 어댑터를 사용하는 경우 onActivityResult에서 어댑터 만 알립니다. 그게 전부 야. – Shailesh