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

shared preference에 저장된 값을 읽어와서 활용하는 방법 [closed]

0 추천
초보자가 공부하고 있습니다.

목표는 다음과 같습니다.

main activity: button, text view

     button 누르면 setting activity로 화면 이동

     text view: setting activity 갔다오면 pref에 있는 값을 읽어서 출력

setting activity: radio group, button

    radio group으로 남녀 택1 하도록 함

    선택 결과는 pref 파일에 저장

    button 클릭하면 main activity로 이동

위는 완성 하였습니다.

pref.xml 파일을 보면 다음과 같이 나옵니다.

    <int name="radioGroup" value="2131231021" />

    <int name="radioGroup" value="2131231024" />

 

앱을 지우고 다시 해 보아도, 실제 전화기에서 하거나 emulator에서 하거나  남, 여에 따라 저장되는 value="2131231024" , value="2131231021" 는 변함이 없습니다.

질문 1입니다.

value는 변하지 않는 것이 맞나요?

2131231024는 어떻게 정해지는 것인가요?

 

만약 value를 읽어서 2131231024이면 "남", 2131231021이면 "여"라고 하면 되나요?

다른 전화기나 다른 사람이 설치하였는데 2131231024로 저장되지 않으면 value를 읽어서 2131231024이면 "남" 이라고 출력하면 않될듯 합니다. 관련 블로그 링크나 api 등 알려 주시면 찾아 보겠습니다. 검색어를 뭐로 해야 할지 잘 못 찾겠습니다.

 

 

하여간 다시 main activity로 복귀 하였으니  pref에 있는 값을 읽어서 text view에 출력하고자 하는데

질문 2입니다.

     setting activity에서 저장한 pref.xml을 접근은 가능 하겠지요?

     (data/data/팩키지명/sharedpref/pref.xml로 저장되어 있습니다)

질문 3입니다.

관련하여 파일에 접근하고, 읽어 들이는 것까지 방법을 알고 싶습니다

구글링 검색어, 관련 블로그, 관련 api, 깃허브 등 어떤 정보 든 알려 주시면 찾아 보겠습니다.

 
초보여서 열심히 검색하면서 3일째 보내고 있는데 찾지 못하고 있습니다
감사합니다
질문을 종료한 이유: 해결되었습니다.
원래자유 (470 포인트) 님이 2022년 1월 30일 질문
원래자유님이 2022년 2월 4일 closed
main에서 아래와 같이 해 보았습니다.

public class MainActivity extends AppCompatActivity {
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       SharedPreferences mPreferences = getSharedPreferences("pref", MODE_PRIVATE); // 없으면 에러 나는 것 같습니다. 제가 이해한 것은 pref.xml 파일 만들때, 읽어 들일 때 모두 필요한 선언 같습니다

        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent mIntent = new Intent(MainActivity.this, SettingActivity.class);
                startActivity(mIntent);
            }
        });

        int height = mPreferences.getInt("radioGroup", 0);
// setting activity에서 저장된 값이  정수여서 정수로 읽어 보았습니다.
        String strHeight = getString(height);
// 정수를 스트링으로도 변경해 보았습니다.
        Toast.makeText(this, "뭔가", Toast.LENGTH_SHORT).show();
// 아래 정수, 스트링 출력 모두 false로 출력이 되어서 확인 해 보려고 추가 하였더니 "뭔가는 출력이 됩니다. 그 의미는 위의 int height 읽어 들이는 것은 잘 된 것 같습니다.
    //     Toast.makeText(this, height, Toast.LENGTH_SHORT).show();
// 위 실행하면 false가 toast 됩니다.
       // Toast.makeText(this, strHeight, Toast.LENGTH_SHORT).show();
// 위 실행하면 false가 toast 됩니다.
    }
}

1개의 답변

+1 추천
 
채택된 답변

저장된 값을 보면:

 <int name="radioGroup" value="2131231021" />
 <int name="radioGroup" value="2131231024" />

어떤 라디오 버튼이 선택되었는지를 저장하는게 아니라, 라디오 버튼의 ID가 저장된 듯한 모습이네요. 아마도 radioGroup.getCheckedId() 같은 메소드를 호출하신 걸로 보입니다. (잘못되었습니다.) 메소드 이름을 보셔도 Id로 되어 있습니다. 코드를 이해하고 잘 작성하는데 이름이 상당히 중요하다는 걸 기억하세요.

SharedPreferences를 접근하는 방법은  개발자 페이지의 API 문서에 잘 나와 있습니다.

https://developer.android.com/reference/android/content/SharedPreferences

그리고 코딩을 하시기 전에 개발자 가이드도 참고하시길 권장합니다.

https://developer.android.com/training/data-storage#pref

간략하게 설명을 드리면

Context.getSharedPreferences(String, int)

를 이용하면 접근하실 수 있습니다. 즉, Context 의 instance는 getSharePreferences(String, Int) 메소드를 통하여 접근할 수 있습니다. Activity의 경우는 Context 의 하위 클래스가 되므로 getSharePreferences()메소드를 통하여 접근하시면 됩니다. 따라서   파일이름과 모드를 넘기시면 됩니다. 두번째 인자는 외부에서는 접근이 되지 않게 하기 위해 사용합니다.

SharedPreferences sharedPreferences = getSharedPreferences("pref", Context.MODE_PRIVATE)

 

아래는 화면에 있는 라디오 버튼의 값을 처리하는 예제입니다.

  private static final int NOT_SET = -1;
    private static final int MALE = 0;
    private static final int FEMALE = 1;
    private static final String GENDER_KEY = "gender"
 
    // onCreate에서 findViewById로 설정을 하세요.
    private RadioButton maleBtn; //남
    private RadioButton femaleBtn; //여

    private void readGender() {
          val gender = mPreferences.getInt(GENDER_KEY, NOT_SET);
          maleBtn.setChecked(gender == MALE);
          femaleBtn.setChecked(gender == FEMALE);
          // TextVeiw에 남녀를 표시하고 싶다면
          String text = "";
          if (gender == MALE) text = "남";
          if (gender == FEMALE) text = "여";
          textView.setText(text);
    }

   private void saveGender() {
       int gender = getSelectedGender();
       mPreferences.edit()
                           .putInt(GENDER_KEY, gender)
                           .commit();
   }

  private int getSelectedGender() {
     if (maleBtn.isChecked()) return MALE;

     if (femaleBtn.isChecked()) return FEMALE;

     return NOT_SET;
  }

 

 그리고 올리신 코드의  getString은 숫자을 문자열로 변환시키는 메소드가 아니고, 리소스 파일에 정의된 문자열을 가져오는 메소드입니다. 아래 링크를 확인하세요. https://developer.android.com/reference/android/content/Context#getString(int)

올리신 코드는 살짝 수정했습니다.

public class MainActivity extends AppCompatActivity {
    private  SharedPreferences mPreferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

      mPreferences  = getSharedPreferences("pref", MODE_PRIVATE); 
  
      Button button = findViewById(R.id.button);
      button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent mIntent = new Intent(MainActivity.this, SettingActivity.class);
                startActivity(mIntent);
            }
        });

        int height = mPreferences.getInt("radioGroup", 0);
        String strHeight = "" + height; // int 정수 변환. String.valueOf(height), new String(height) 등도 사용할 수 있슴.

        Toast.makeText(this, "뭔가", Toast.LENGTH_SHORT).show();

        // 위 실행하면 false가 toast 됩니다. => 액티비티에서 getString()은 리소스 파일에 있는 스트링을 읽어오는 메소드입니다. 
        // Toast.makeText(this, strHeight, Toast.LENGTH_SHORT).show();

    }
}

 

spark (224,800 포인트) 님이 2022년 1월 30일 답변
원래자유님이 2022년 2월 3일 채택됨
아주 기본적인 코드이므로, 이해가 안가신다면, 자바 공부를 먼저하시는게 좋다고 봅니다.
그리고 안드로이드 개발자 문서에 모든 것이 나오므로 중요한 부분들은 정독을 하시는제 좋습니다. 그리고 구글에서도 온라인 강좌를 제공하고 있습니다.
https://developer.android.com/courses
참고로 언어가 코틀린입니다. 안드로이드 개발을 계속하실 계획이면, 자바와 코틀린을 모두 알아두시는게 좋습니다. 전세계적으로는 코틀린이 더 많이 사용되고 있습니다.
감사합니다.
여러 가지 부족한 부분이 있어 시행 착오 거치면서 조금씩 배워가고 있습니다.

처음엔 저장된 것이 뭔지 몰라서 이해 못하고 있었으나, 말씀하신 내용 잘 이해 하였고, 그래서 문제 해결하였습니다.

감사합니다.
...