본문 바로가기
안드로이드 스튜디오

[안드로이드 스튜디오] 앱만들기 #8. SharedPreferences

by sojung118 2024. 8. 29.

[ 실행 화면 ]


 

SharedPreferences를 이용해서 앱을 나가거나 뒤로가기를 해도 텍스트가 그대로 남아있도록 해보기!

※ 주의 : SharedPreferences는 앱을 아예 삭제하면 소멸된다. 이 경우에는 데이터베이스를 써야함...

 

 

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <EditText
        android:id="@+id/et_save"
        android:layout_width="100dp"
        android:layout_height="wrap_content"/>


</LinearLayout>

 

activity_main.xml은 간단하게 EditText 하나만 추가시켰다.

SharedPreferences는 대부분 MainActivity에서 작동할 예정이다.

 

 

 

 

2. MainActivity.java

package com.example.sharedexample;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.EditText;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    EditText et_save;
    String shared = "file";

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

        et_save = findViewById(R.id.et_save);

        //인자 두개 1. string값 만들어둔 것 1번째 인자, 2.는 mode, 0으로 설정
        SharedPreferences sharedPreferences = getSharedPreferences(shared,0);

        //인자 두개, 1. value 가져올 별명 2. 빈값으로 고정
        String value = sharedPreferences.getString("sojung","");
        //et_save에 value를 setText해주기 (value string값을 넣어주기)
        et_save.setText(value);
    }

    @Override
    protected void onDestroy() { //이 액티비티를 벗어났을 때 실행되는 것
        super.onDestroy();

        //SharedPreferences로 저장을 시키고 나갈 수 있도록..
        SharedPreferences sharedPreferences = getSharedPreferences(shared,0);
        //저장을 할때 항상 .Editor을 불러와줘야한다.
        SharedPreferences.Editor editor = sharedPreferences.edit();
        //sharedPreferences안에 에디터를 연결시켜준 것


        String value = et_save.getText().toString(); //현재 써져있는 값 받아오기, toString 형태로

        //editor에 받아온 값을 그대로 적어주기
        //sojung이라는 별명으로 value값을 가져오기
        editor.putString("sojung",value);
        editor.commit();

    }
}

 

주석으로 줄줄이 뭘 많이 써놓긴 했는데...

다시 한번 쓰면서 복기해보기!

 

 

첫번째로 해 줄 일은 언제나 그랬듯 변수 선언하고 id 할당해주기!

  • EditText et_save;
  • String shared = "file" : shared 이름의 String 변수를 하나 만들어준다! 뒤에서 사용됨
  • et_save = findViewById (R.id.et_save);

 

//인자 두개 1. string값 만들어둔 것 1번째 인자, 2.는 mode, 0으로 설정
SharedPreferences sharedPreferences = getSharedPreferences(shared,0);

 

두번째로 해 줄 일은 내용을 저장해야하니까 SharedPreferences 변수 만들어주기!

SharedPreferences 까지 치고 다음에 s 하나만 치면 자동적으로 변수 이름을 추천해준다.

첫번째 인자로는 String값으로 만들어둔 변수 shared, 두번째 인자는 mode인데 그냥 0으로 설정한다.

 

 

 

이후 액티비티를 나가거나, 종료되거나 했을 시 실행할 함수를 만든다.

@Override
protected void onDestroy() { //이 액티비티를 벗어났을 때 실행되는 것
    super.onDestroy();

    //SharedPreferences로 저장을 시키고 나갈 수 있도록..
    SharedPreferences sharedPreferences = getSharedPreferences(shared,0);
    //저장을 할때 항상 .Editor을 불러와줘야한다.
    SharedPreferences.Editor editor = sharedPreferences.edit();
    //sharedPreferences안에 에디터를 연결시켜준 것


    String value = et_save.getText().toString(); //현재 써져있는 값 받아오기, toString 형태로

    //editor에 받아온 값을 그대로 적어주기
    //sojung이라는 별명으로 value값을 가져오기
    editor.putString("sojung",value);
    editor.commit();

}

 

이름에서부터 onDestroy! 액티비티를 벗어났을 때 실행될 것이라는 강한 촉이 온다.

여기서도 마찬가지로 SharedPreferences 변수를 선언해준다.

그리고 내용을 저장하기 위해서는 항상 .Editor을 써주어야한다고 한다.

 

SharedPreferences.Editor editor = sharedPreferences.edit(); 과정으로 연결시켜주기!

Editor도 뒤에 ed까지 치면 자동적으로 변수 이름을 추천해준다.

String 으로 value를 선언해주고, et_save.getText().toString()으로 et_save에 써진 내용을 String형태로 받아온다.

그러면 value 값에는 et_save의 내용이 String 형태로 저장되어있다.

 

이제 editor에 받아온 값을 그대로 적어주면 된다.

editor.putString ("별명", "받아올 값");    //editor.putString("sojung", value);

editor.commit(); 까지 해주면 editor에 저장이 완료된다.

 

 

이제 다시 onCreate 함수로 돌아가서

//인자 두개, 1. value 가져올 별명 2. 빈값으로 고정
String value = sharedPreferences.getString("sojung","");
//et_save에 value를 setText해주기 (value string값을 넣어주기)
et_save.setText(value);

 

이 코드를 추가해준다!

여기서도 value를 선언하고, sharedPreferences는 getString으로 받아올 값을 가진 별명을 첫번째 인자로 가져온다.

두번째 인자는 빈값으로 고정...

 

마지막으로 et_save.setText(value); 까지 해서 et_save에 value값을 넣어주면?

 

 

액티비티를 벗어나도 값이 저장되어있는 SharedExample 만들기 완성~

 

SharedExample 같은 경우는 휴대폰에서 스위치 고정, 진동/무음 고정 등에 주로 쓰인다고 한다.

물론 이렇게 내용을 기억해야하는 경우에도 종종 쓰인다!

 

써둔 코드를 보니 onCreate에서는 불러오기, onDestroy에서는 저장하기 가 되는것을 알 수 있당 :)

 

 


 

+ 나의 의문 ... shared는 무슨 의미지? → chatGPT 답변

 

String shared = "file";의 선언은 SharedPreferences를 사용할 때 공유 설정 파일의 이름을 지정하기 위한 것입니다. 이 문자열은 getSharedPreferences() 메서드에 전달되어, 설정 값을 저장하거나 불러올 때 사용됩니다.

 

설정 파일의 이름 지정: getSharedPreferences(shared, 0) 메서드에서 첫 번째 인자로 전달되는 문자열이 설정 파일의 이름이 됩니다. 이 이름은 Android의 내부 저장소에 있는 실제 파일 이름을 나타내며, 이 파일에 설정 값이 저장됩니다. 만약 이 이름을 동일하게 사용한다면, 다른 액티비티나 서비스에서도 같은 설정 파일에 접근할 수 있습니다.