안드로이드 uri를 사용하여 이미지 뿌리기
조회수 3363회
제가 안드로이드 스튜디오에서 앱을 만들고 있습니다. 프래그먼트에서 버튼을 클릭하면 대화상자가 뜨고 사진과 간략한 설명을 넣을 수 있습니다. (사진은 사용자의 갤러리에서 가져옵니다.) 확인을 누르면 대화상자가 닫히고 프래그먼트에 존재하는 RecyclerView에 이미지와 설명이 들어갑니다. 그러나 제가 짠 코드는 설명은 들어가나 이미지가 들어가지 않습니다. 이에 대한 해결방안을 듣고 싶어서 질문을 올리게 되었습니다. 답변해주시면 감사하겠습니다!
저의 코드가 어떻게 돌아가는지 간략히 설명하자면, 대화상자에서 이미지를 받아오면 토스트 메시지로 해당 파일의 경로(/storage/emulated/0/Pictures/a.jpg)를 띄워주고 대화상자가 닫힘과 동시에 프래그먼트로 경로와 설명이 String 형태로 전달되고 경로는 프래그먼트에서 다시 Uri로 변환되어 이를 이용한 Bitmap으로 변하여 RecyclerView에 뿌려지는 형식입니다.
아래는 저의 코드입니다.
**Fragment.java**
// 리스트를 생성하기 위한 버튼
btn_addlist = view.findViewById(R.id.btn_addlist);
btn_addlist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 버튼을 클릭하면 DialogFragment_cus 객체를 생성하여 보여준다.
DialogFragment_cus dialog = new DialogFragment_cus();
dialog.show(getActivity().getSupportFragmentManager(), "tag");
// DialogFragment_cus.java에서 보낸 데이터를 전달 받는다.
dialog.setDialogResult(new DialogFragment_cus.OnMyDialogResult() {
// result : uri, result2 : dlg_edtName, result3 : dlg_edtSubtitle
@Override
public void finish(String result, String result2, String result3) {
imageUri = result; RecyclerInputName = result2;
RecyclerInputSubtitle = result3;
Uri uri = Uri.parse("file://" + imageUri);
Bitmap bitmap = null;
try {
// uri 주소를 Bitmap으로 변환한다.
bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
RecyclerItem_cus item = new RecyclerItem_cus(bitmap, RecyclerInputName, RecyclerInputSubtitle);
mArrayList.add(0, item);
mAdapter.notifyDataSetChanged();
Toast.makeText(getActivity(), "리스트가 완성되었습니다! 삭제하시려면 리스트를 길게 눌러주세요.", Toast.LENGTH_SHORT).show();
}
});
}
});
**DialogFragment.java**
// dlg_AddButton : 갤러리에서 사진 가져오기
dlg_AddButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_PICK);
startActivityForResult(intent, 1);
}
});
// dlg_ok : RecyclerView에 반영
dlg_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment_cus fragment = new DialogFragment_cus();
// 사용자가 리스트에 넣기 위해 적은 텍스트를 저장한다.
String input1 = dlg_edtName.getText().toString();
String input2 = dlg_edtSubtitle.getText().toString();
if(fragment != null) {
if(mDialogResult != null ) {
// uri, dlg_edtName, dlg_edtSubtitle을 각각 finish 함수로 전달한다.
mDialogResult.finish(name_Str, input1, input2);
}
}
dismiss();
}
});
// dlg_cancel : Dialog 닫기
dlg_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// dismiss : Dialog 닫기
dismiss();
}
});
return view;
}
public void setDialogResult(OnMyDialogResult dialogResult){
mDialogResult = dialogResult;
}
public interface OnMyDialogResult{
void finish(String result, String result2, String result3);
}
// 갤러리를 호출하여 선택된 이미지를 onActivityResult() 메서드에 받은 후 Bitmap으로 ImageView에 표시
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == RESULT_OK) {
try {
name_Str = getImageNameToUri(data.getData());
// 선택한 이미지에서 비트맵 생성
InputStream in = getActivity().getContentResolver().openInputStream(data.getData());
Bitmap img = BitmapFactory.decodeStream(in);
in.close();
// 이미지 표시 및 ImageView 배경 투명화
dlg_ImageView.setImageBitmap(img);
dlg_ImageView.setBackgroundResource(android.R.color.white);
Toast.makeText(getActivity(), "name_Str : "+name_Str , Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 실제 이미지 파일이 저장된 경로를 얻기 위한 메소드
// 갤러리 액티비티를 통해 선택한 이미지의 uri 값을 파라미터로 던져주면 실제 SD카드의 경로를 리턴해주는 함수이다.
public String getImageNameToUri(Uri uri) {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
getActivity().startManagingCursor(cursor);
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(columnIndex);
}
**RecyclerView_cusAdapter.java**
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int i) {
final RecyclerItem_cus item = items.get(i);
if (item != null) {
Glide.with(context)
.load(item.getImage())
.asBitmap()
.format(DecodeFormat.PREFER_ARGB_8888)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
myViewHolder.cus_img.setImageBitmap(resource);
}
});
myViewHolder.cus_title.setText(item.getTitle());
myViewHolder.cus_subtitle.setText(item.getSubTitle());
}
}
@Override
public int getItemCount() {
return this.items.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView cus_title;
TextView cus_subtitle;
ImageView cus_img;
public MyViewHolder(View itemView) {
super(itemView);
cus_title = itemView.findViewById(R.id.cus_title);
cus_subtitle = itemView.findViewById(R.id.cus_subtitle);
cus_img = itemView.findViewById(R.id.cus_img);
}
}
**RecyclerItem_cus.java**
public class RecyclerItem_cus {
private Bitmap image;
private String title;
private String subTitle;
public RecyclerItem_cus(Bitmap image, String title, String subTitle) {
this.image = image;
this.title = title;
this.subTitle = subTitle;
}
public Bitmap getImage() {
return image;
}
public String getTitle() {
return title;
}
public String getSubTitle() {
return subTitle;
}
댓글 입력