SharedPreferences
개념과 정의
- 안드로이드 앱에서 데이터를 저장하는 방법
- 프로그램의 설정 정보를 저장한다.
- xml 포맷의 텍스트 파일에 (키-값) 세트로 저장 (...?)
사용 방법
getSharedPreferences
(name, mode)
-> (getPreferences
도 사용하긴 하지만..)(아직은 무슨 말인지는 잘 모르겠지만.. ㅋㅋ)
SharedPreferences 클래스
- Preferences의 데이터(키-값 세트)를 관리하는 클래스
- 응용 프로그램 내의 액티비티 간에 공유하며, 한쪽 액티비티에서 수정 시 다른 액티비티에서도 수정된 값을 읽을 수 있다.
- 응용 프로그램의 고유한 정보이므로 외부에서는 읽을 수 없다.
-> name
: 데이터를 저장할 xml 파일 이름..?
-> mode
: 파일의 공유 모드MODE_PRIVATE : 생성한 XML 파일은 호출한 앱 내에서만 사용 가능
MODE_WORLD_READABLE(읽기 모드) / MODE_WORLD_WRITEABLE(쓰기 모드)
-> 예시val sharedPref = activity?.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE)
-> 사용 가능한 데이터 타입putBoolean
putFloat
putInt
putLong
putString
putStringSet (얘는 뭘까요..?)
실제로 사용해보기
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:textColor="#000000"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_save"
android:layout_width="wrap_content"
android:layout:height="wrap_content"
android:marginTop="32dp"
android:text="저장하기"
app:layout_constraintTop_toBottomOf="et_hello"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
package com.android.preference
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.android.preference.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
binding.btnSave.setOnClickListener {
saveData()
Toast.makeText(this, "Data Saved", Toast.LENGTH_SHORT).show()
}
loadData()
}
private fun saveData() {
val pref = getSharedPreferences("pref", 0)
val edit = pref.edit()
edit.putString("name", binding.etHello.text.toString())
edit.apply()
}
private fun loadData() {
val pref = getSharedPreferences("pref", 0)
binding.etHello.setText(pref.getString("name", "defalt value"))
}
}
실행 결과
EditText에 원래 "defalt value"에 정한 데이터가 띄워질 텐데
데이터를 입력하고 저장하기 버튼을 누르면 해당 데이터가 저장된다.
그리고 앱을 완전히 종료하고 다시 시작해도 해당 데이터가 띄워져 있다