2014-04-15 7 views
9

자식 조각에서 부모 조각으로 돌아갈 때 읽을 수있는 부모 조각으로 일부 데이터를 전달해야합니다. 자세히 :Android : 하위 조각에서 부모 조각으로 데이터 전달

나는 FragmentParent를 호출하는 FragmentActivity를 가지고 있습니다. FragmentParent에서 나는 다음과 같이 FragmentChild 전화 :

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

가 FragmentChild에서 내가 FragmentParent 다시 전달해야하고 내가 FragmentParent로 다시 돌아 문자열 값을 설정합니다.

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

FragmentParent에서 결과 문자열을 읽는 가장 좋은 방법은 무엇입니까?

답변

39

안드로이드 아키텍처 구성 요소 솔루션 : 당신이 안드로이드 아키텍처 구성 요소를 사용하는 경우

, 것이 가능 ViewModel 모든 FragmentsActivity의 사이에서 데이터를 공유 할 수 있습니다. ViewModelProvidersActivity 컨텍스트를 사용하여 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. 
     }); 
    } 
} 

비 안드로이드 아키텍처 구성 요소 솔루션 :

당신은 setTargetFragmentonActivityResult이를 달성하기 위해 사용할 수 있습니다. 사용자가 호출된다 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); 
      } 
     } 
    } 
} 
+1

이것은 성공했지만 onActivityResult에서 UI를 업데이트 할 수 없습니다. 이걸로 도울 수 있니? –

+0

@Manish Mulimani : 좋아요, 시간을 절약 해줍니다. 감사합니다 Manish. – Shailesh

+0

@Farooq Arshed : UI 업데이트의 경우보기를 새로 고쳐야합니다. 예를 들어, 어댑터를 사용하는 경우 onActivityResult에서 어댑터 만 알립니다. 그게 전부 야. – Shailesh

관련 문제