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

sharedPreferences와 onActivityResult를 이용해 이미지 저장을 하려고 합니다.

0 추천
    private SharedPreferences sPreferences;
	private SharedPreferences.Editor editor;
    private int a;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_profile);

img1 = (ImageView) findViewById(R.id.picture_profile);
		img1.setImageResource(drawable.profile0001_n);

//여기에 처음 Activity에 들어왔을때 기본이미지를 설정해 주었습니다.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		
		switch (resultCode) {
		case 0:
			img1.setImageResource(R.drawable.profile0001_n);
			a = R.drawable.profile0001_n;
			sPreferences = getSharedPreferences("img001" , MODE_PRIVATE);
            editor = sPreferences.edit();
            editor.putInt("img002", a);
            editor.apply();
			break;
			
		case 1:
            img1.setImageResource(R.drawable.profile0002_n);
            a = R.drawable.profile0002_n;
            sPreferences = getSharedPreferences("img001" , MODE_PRIVATE);
            editor = sPreferences.edit();
            editor.putInt("img002", a);
            editor.apply();
			break;

//그리고 타 Activity에서 GridView를 통해 선택을 한 후 포지션 값을 받아와서
//onActivityResult에 switch문을 통해, 포지션값 별로 이미지가 셋팅되게끔
// 했습니다. 총 6개의 이미지 입니다. 그리고 int a 값을 통해서 editor에 저장
//되게끔 했습니다.

@Override
	public void onClick(View v) {

		switch (v.getId()) {
		case R.id.btn_button_ok001:
			
			sPreferences = getSharedPreferences( "img001" , MODE_PRIVATE);
    		img1.setImageResource(a);
			
			finish();
			break;

//그리고 버튼 클릭이벤트를 통해 이미지소스를 받아오게끔 해놨습니다.

 


이렇게 하고 실행을 했는데 switch문을 통해 포지션값은 잘 넘어와서 setimageresource는 됩니다.

하지만 제가 무엇을 잘못했는지 아직 깨닫지 못했는데 ok버튼을 눌르고 나갔다가 다시 들어왔을때

저장이 되어있지 않습니다.

에러로그는 하나도 없구요.

한달째 자바랑 안드로이드 같이 공부하고 있으면서 일하고 있는데

너무 힘드네요 ㅠ_ㅠ

제가 질문을 두서없이 적어서 죄송하지만 잘 부탁드립니다 ㅠ

카라멜모카 (190 포인트) 님이 2016년 12월 22일 질문

1개의 답변

+1 추천
 
채택된 답변

질문을 두서있게 적어야 답변이 달립니다... 취미든 직업이든 프로그래머는 언젠간 질문을 해야하고, 답변 달아줄 사람이 쉽게 알아볼 수 있어야 빠르고 정확하게 답변이 달립니다. 그리고 질문 수정 기능이 있으니 원래 질문을 놔두고 굳이 새 질문을 올릴 필요까진 없습니다. 


먼저 A 액티비티는 선택된 이미지 하나를 표시하고, B는 GridView가 있고, 여러 이미지 중에 하나를 선택하는 걸로 이해했습니다.

ok 버튼은 어디에 달려있고, 어디서 호출하며, 어떤 동작을 하는지는 모르겠지만, preference를 사용한다는 건 앱이 완전히 종료됐다가 다시 켜졌을 때 전에 사용한 걸 다시 불러오는 용도로 쓰이니 B액티비티에서 마지막으로 선택한 이미지를 A액티비티에 표시하고 싶다는 걸로 생각하겠습니다.


sPreferences = getSharedPreferences("img001" , MODE_PRIVATE);

지금은 img001 이라고 적고있지만, 사실 이건 앱의 모든 부분에서 사용할 것이므로 보통은 img001이 아닌 kr.susemi99.mytestapp이나 pref 같은 문자열로 많이 적습니다. 

저는 보통

sPreferences = PreferenceManager.getDefaultSharedPreferences(context);

로 사용합니다.


editor = sPreferences.edit();
editor.putInt("img002", a);
editor.apply();

이건 prefrece 안에 img002 라는 항목에 a를 저장해둔다는 뜻입니다.

a 가 어떤 값인지 Log를 찍어보시고, 

sPreferences.getInt("img002", -1)

이것도 Log를 찍어보세요. 

-1이면 저장이 안된 거고, 대여섯 자리의 숫자가 나온다면 잘 저장된 겁니다.


저장이 잘 됐다면 이제는 불러와서 표시만 하면 됩니다.

지난 번 질문에서 제가 getInt()를 어디서 하냐고 물었을 때 자꾸 다른 말씀을 하는 걸 보니 아마 안하고 있었을 겁니다. 

img1 = (ImageView) findViewById(R.id.picture_profile);
int resId = sPreferences.getInt("img002", -1);
if (resId != -1) {
  img1.setImageResource(resId); 
}
else { 
  img1.setImageResource(drawable.profile0001_n); 
}

정확히 어떤 걸 원하는 지는 모르겠지만, 이런 식으로 하면 될 겁니다.


어떤 걸 보면서 공부하시는 지는 모르겠지만, 강좌용으로 나온 거라면 분명 비슷한 코드가 거기에 있을 겁니다. 마음이 급하거나 잘 안된다고 자책하지 말고 차근차근 진행하세요.

쎄미 (162,410 포인트) 님이 2016년 12월 22일 답변
카라멜모카님이 2016년 12월 22일 채택됨
정말 감사드립니다.  쎄미님이 정말 자세히 설명해 주셔서 Log도 찍어보고 다 해봤는데 저한테 많은 도움이 되었던 것 같습니다. 기초지식 전혀없이 안드로이드회사에 입사해서 죽을 맛이지만 열심히 해보겠습니다. 다음번에 질문할 때에는 더 자세하게 깔끔하게 올릴 수 있도록 노력해보겠습니다

다시한번 감사드려용!
...