(Android) Fragment 에서 getActivity().startActivityForResult로 Activity로 값전달하기

조회수 1999회

A라는 엑티비티 위에 B라는 프레그먼트를 올렸습니다.

B라는 프레그먼트에서

getActivity().startActivityForResult()를 사용해

B(fragment)->A(activity)->B(fragment)로 값을 다시 받아옵니다.

여기서 문제가 발생하는데요 A엑티비티에서 int requestCode, int resultCode, Intent data 라는 3개의 인자를 받아오는데

로그를 찍어보면 request코드에는 값이 잘들어가지만 Intent에는 null 값이 들어갑니다.

왜이런지와 data를 받아올수있는 해결방안좀 알려주시면 정말 감사드리겠습니다.

고수님들 부탁드리겠습니다. 밑에는 예시코드입니다.

B fragment

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //사진인테트 호출
                    if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {
                        File photoFile = null;
                        try {
                            photoFile = createImageFile();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        if (photoFile != null) {
                            Uri providerURI = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID + ".fileprovider", photoFile); //프로바이드 생성
                            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, providerURI); //사진저장경로 불러옴

                            getActivity().startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); //엑티비티 사진저장
                        } else {
                            Toast.makeText(getContext(), "저장공간이 접근 불가능한 기기입니다.", Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }

A activity

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Log.v("resultCode",resultCode+"");
    Log.v("requsetCode",requestCode+"");
    Log.v("data",data+"");

    changeFragment(ReceptionTakePictureViewFragment.class);
}

A Activity에서 B Fragment의 providerURI를 받아오는게 목표입니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 일단 제가 질문을 잘 이해한것인지는 모르겠습니다. 만약 제가 문제를 잘못이해한거라면 깃허브 주소좀 알려주세요

    A activity

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    Log.v("resultCode",resultCode+"");
    Log.v("requsetCode",requestCode+"");
    Log.v("data",data+"");
    
    changeFragment(ReceptionTakePictureViewFragment.class);
    }
    

    이 함수에서 data는 intent 객체입니다.

    Uri providerURI = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID + ".fileprovider", photoFile); //프로바이드 생성
                            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, providerURI); //사진저장경로 불러옴
    
                            getActivity().startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); //엑티비티 사진저장
    

    이 부분을 보면 putExtra 함수로 인텐트내부에 데이터를 저장한것을 볼 수 있습니다. putExtra함수를 이용해서 값을 저장했다면 getTypeExtra를 사용하실 수 있습니다. Uri가 어떤 형태로 저장되는지 모르겠지만

     String key = data.getStringExtra(MediaStore.EXTRA_OUTPUT);
    //putExtra로 저장하는 값에 종류에 따라 getStringExtra, getIntExtra 함수를 사용할 수 있습니다.
    

    일단 저렇게 코드를 추가하면 key라는 변수에 uri가 저장될 것입니다. String으로 저장된 값은 parse함수를 이용해서 바꿀수있습니다.

    URI uri;
    uri=URI.parse(key);
    

    저도 막 안드로이드를 공부하고있는 학생이고 해시코드에서 많은 도움을 받는 학생입니다. 제가 틀렸을 수 있습니다. 부디 도움이 되셨으면 좋겠습니다.

  • 안드로이드에서 Fragment 와 Activity 간 통신 방법은 다음과 같습니다.

    1. Activity -> Fragment

    1. Fragment 의 인스턴스를 구해서 해당 Fragment 에 선언해둔 메소드를 통하여 값을 넘긴다.

    2. Fragment -> Activity

    여기는 콜백 리스너라는 것을 구현해야 하는데요.

    1. 인터페이스를 선언한다. (넘길 값 그대로 인터페이스 내부에 메소드를 정의)
    2. 이러한 인터페이스를 Activity 클래스 단에서 implements 한다.
    3. Fragment 의 onAttach 라이프 사이클 메소드에서 인자로 Context 가 들어오는데, 이것을 해당 인터페이스 타입으로 캐스팅하여 Fragment 의 멤버 변수로서 보관한다.
    4. Activity 로 값을 넘길 때 3번에서 보관한 인터페이스의 메소드를 통하여 값을 넘긴다.
    5. Activity 에서는 2번에서 implements 한 콜백 메소드의 인자로 4번 항목에서 Fragment 가 전달한 값이 들어온다.
    public interface CallbackListener {
        void callbackMethod(Uri uri);
    }
    
    public class HostActivity extends Activity implements CallbackListener {
    
        ....
    
        @Override
        public void callbackMethod(Uri uri) {
            // Fragment 에서 전달한 값이 uri 인자로 들어옴
        }
    
        ....
    }
    
    public class ChildFragment extends Fragment {
        private CallbackListener mListener;
    
        @Override
        public void onAttach(Context context) {
            mListener = (CallbackListener) context;
        }
    
        private void sendValue(Uri value) {
            if (mListener != null) {
                mListener.callbackMethod(value);
            }
        }
    
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)