Android

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

Fragment에서 호출한 Activity의 리턴 결과를 받아서 처리해야할 경우 가끔 사용의 혼돈으로 프레그먼트에서 onActivityResult()를 재정의 하여 Fragment관련  처리합니다. 하지만 이것은 잘 못된 방법입니다. Fragment 안에 onActivityResult()메소드를 재정의하여도 호출되지않는 이유가 바로 여기에 있습니다. 그 이유는 onActivityResult()메소드는 Fragment를 포함하고 있는 Activity 클래스 부터 호출하게 됩니다. 그럼으로  부모액티비티에서 처리해야합니다.  그런 과정에 requestCode 인자의 값으로 전달했던 값이 다른 값으로 리턴되어 로직을 실행하지 않는 경우가 발생합니다. 이러한 경우에 어떻게 처리하면 될까요? 리턴결과 값을 특정 계산식을 사용하여 처리하는 방법도 있으나 아주 간단한 방법을 소개합니다.

 

재현 시나리오

1. MainActivity 클래스(부모 액티비티)에서 탭레이아웃(TabLayout)을 구성 후 탭레이아웃에 Fragment를 사용하여 화면을 구성합니다.

2. FirstFragment 클래스에서 startActivityForResult()메소드를 사용하여 SecondActiviy 클래스를 호출합니다. requestCode는 555를 사용합니다.

3. SecondActivity 클래스에서 결과를 리턴합니다.

4. MainActivity 클래스에서 onActivityResult()를 오버라이드(재정의) 하여 결과를 리턴 받을때 requestCode 값을 출력해봅니다.

 

[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){
            } 
        }

    }

 

[FirstFragment 클래스]

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
						 Bundle savedInstanceState) { 
                         
	View view = inflater.inflate(R.layout.fragment_calendar, container, false);
    startActivityForResult(new Intent(getContext(), SecondActivity.class), 555);

	return view;
}

 

[SecondActivity 클래스]

public void onClicked(View v){        
        Intent returnIntent = new Intent();
        returnIntent.putExtra("PrimaryKey", 1024);
        setResult(Activity.RESULT_OK,returnIntent);
        finish();
}        

 

 

FirstFragment클래스에서 requestCode값으로 555를 전달했으나 MainActivity 클래스의 onActivityResult()메소드에서 받은 requestCode는 555가 아닌 다른 정수값이 리턴되었습니다. 왜 이런 현상이 발생하는 것일까요? 이유는 잘 모르겠습니다. 해결책은 프레그먼트에서 startActivityForResult()메소드를 사용할 때 앞에 Fragment클래스의 getActivity()를 적용 후 호출해야합니다.

getActivity().startActivityForResult(new Intent(getContext(), SecondActivity.class), 555);

 

[참고]

stackoverflow.com/questions/6147884/onactivityresult-is-not-being-called-in-fragment

developer.android.com/reference/android/app/Activity#startActivityForResult(android.content.Intent,%20int)

[안드로이드] onActivityResult() 메소드가 호출되지 않을 때 유의점

developer.android.com/reference/android/app/Activity#onActivityResult(int,%20int,%20android.content.Intent)

developer.android.com/training/basics/intents/result#java

 

Leave a Reply

error: Content is protected !!