마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

액티비티에서 이미지를 불러오는 코드를 프래그먼트로 적용하는 방법

0 추천

액티비티에서 (이미지 클릭 ->intent로 기기 내의 이미지 선택 -> onActivityResult로 해당 이미지를 액티비티내에 이미지 뷰에 적용)  다음 단계들을 통해 이미지가 나타나도록 했습니다.

그런데 이 액티비티를 프래그먼트로 옮기게 되자 문제가 발생했습니다. 찾아보니 프래그먼트가 들어있는 액티비티로 result가 반환되기 때문이라고도 하는데 이를 해결하는 방법을 모르겠네요 ㅠㅠ

1) 액티비티

///////////////////

public void onClick(View v) {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_PICK);
    startActivityForResult(intent, REQUEST_CODE);
}

---> 이미지를 클릭해 액티비티로 이동합니다.

이런

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Uri uri = data.getData();
            if(uri!=null){
                Glide.with(getApplicationContext()).load(uri).into(useriamge_view);
                imgpath = getRealPathFromURI(uri);
                new AlertDialog.Builder(this).setMessage(uri.toString()+"\n"+imgpath).create().show();
                //Upload_img(imgpath);
            }
        }

    } else if (resultCode == RESULT_CANCELED) {

    }
}

private String getRealPathFromURI(Uri contentURI) {

    String thePath = "no-path-found";
    String[] filePathColumn = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(contentURI, filePathColumn, null, null, null);
    if(cursor.moveToFirst()){
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        thePath = cursor.getString(columnIndex);
    }
    cursor.close();
    return  thePath;
}

--->onActivityResult에 해당하는 코드로 액티비티에서는 정상적으로 작동했습니다.

이를 프래그먼트로 그대로 옮기니 빨간 글자 부분은 에러가 나네요

어떻게 하면 프래그먼트에서 실행한 값을 액티비티가 아니라 프래그먼트로 다시 넘겨 받을 수 있을까요?

RollingRaccoon (160 포인트) 님이 2020년 11월 26일 질문

1개의 답변

0 추천

getContentResolver는 Activity에 속한 메소드인 것 같네요. 프레그먼트에서는 getActivity(), requireActivity() 등을 통해서 부모 액티비티를 얻을 수 있습니다. 이 말은 이 메소드들을 통해 프레그먼트를 감싸고 있는 액티비에 접근이 가능해 지겠죠.

그리고  해당 프레그먼트에 getContentResolver 란 메소드를 만드시고 contentResolver를 따로 만들어서 사용하세요. 작은 차이지만 이 메소드를 사용하는 코드에서는 어떻게 content resolver 가져오는지 알 핖요가 없어지므로, 이런 방법이 추후에 유지보수에 도움이 됩니다.

 

// Fragment
private ContentResover getContentReolver() {
     return getActivity().getContentResolver();
}  

 도움이 되시길.

spark (227,470 포인트) 님이 2020년 11월 27일 답변
...