[Android] 뷰페이져(viewpager)에서 현재 Fragment 인스턴스를 가져오는 방법과 Fragment 강제 갱신처리(reload) 하는 방법은?
Fragment에서 호출한 Activity의 리턴 결과를 받아서 처리해야할 경우 Fragment 에서 onActivityResult()메소드를 재정의하여도 다이렉트로 호출할 수 없습니다. 그럼으로 메인액티비티 클래스에서 onActivityResult()메소드를 재정의 후 프레그먼트 관련 처리를 해야합니다. TabLayout을 사용중이거나 뷰페이저를 사용중일 때 현재 Fragment 인스턴스를 찾은 후 프래그먼트에서 재정의한 onActivityResult()메소드를 호출하면 접근이 가능합니다. MainActivity클래스에서 현재 프래그먼트 인스턴스를 찾는 방법의 해결 실마리는 뷰페이저에 있습니다. 뷰페이저에서 어댑터를 접근 후 instantiateItem()메소드를 사용하여 현재 사용중인 Fragment를 가져올 수 있습니다. 현재 사용중인 프래그먼트를 찾은 후 프래그먼트에서 재정의했던 onActivityResult()메소드를 호출하여 접근이 가능해집니다. TabLayout를 사용시 현재 사용중인 프래그먼트를 갱신해야할 경우가 많은데, 기본적인 프레그먼트 갱신방법을 사용할 수 없는 경우, 혹은 사용중인 오픈소스 라이브러리에서 접근가능한 메소드를 제공하지 않는 다면 아래와 같은 방법으로 접근하면 됩니다.
Fragment fragment
= (FirstFragment) viewPager.getAdapter().instantiateItem(viewPager, viewPager.getCurrentItem());
((FirstFragment) fragment).onActivityResult(requestCode, resultCode, data);
두번째로 프레그먼트에서 재정의한 onActivityResult()메소드안에서 프래그먼트를 갱신처리하는 방법은 다음과 같습니다.
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
[MainActivity클래스]
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(DefaultSettings.TAG, "=== MainActivity.onActivityResult() : requestCode = " + requestCode);
if(requestCode == 555){
if(data != null){
Fragment fragment = (FirstFragment) viewPager.getAdapter().instantiateItem(viewPager, viewPager.getCurrentItem());
((FirstFragment) fragment).onActivityResult(requestCode, resultCode, data);
}
}
}
[FirstFragment 클래스]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_calendar, container, false);
getActivity().startActivityForResult(new Intent(getContext(), SecondActivity.class), 555);
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
}catch (Exception e){
}
}
[SecondActivity 클래스]
public void onClicked(View v){
Intent returnIntent = new Intent();
returnIntent.putExtra("PrimaryKey", 1024);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
[REFERENCE]
stackoverflow.com/questions/18609261/getting-the-current-fragment-instance-in-the-viewpager
stackoverflow.com/questions/20702333/refresh-fragment-at-reload/20702418