Android

[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]

playground.naragara.com/854

 

[Android] 프레그먼트(Fragment)에서 startActivityForResult()메서드 사용시 requestCode의 값이 다르게 리턴될

Fragment에서 호출한 Activity의 리턴 결과를 받아서 처리해야할 경우 가끔 사용의 혼돈으로 프레그먼트에서 onActivityResult()를 재정의 하여 Fragment관련 처리합니다. 하지만 이것은 잘 못된 방법입니다

playground.naragara.com

stackoverflow.com/questions/18609261/getting-the-current-fragment-instance-in-the-viewpager

stackoverflow.com/questions/20702333/refresh-fragment-at-reload/20702418

 

Leave a Reply

error: Content is protected !!