외로운 Nova의 작업실
안드로이드 앱 프로그래밍 - 35(공유된 프리퍼런스에 보관하기) 본문
- 프리퍼런스
공유된 프리퍼런스는 플랫폼 API에서 제공하는 클래스로 데이터를 키-값 형태로 저장할때 사용합니다. 공유된 프리퍼런스는 앱의 간단한 데이터를 저장하는데 유용하며 내부적으로 내장 메모리의 앱 폴더에 XML 파일로 저장됩니다. 프리퍼런스는 액티비티단위로 만들거나 앱 전체의 프리퍼런스로 만들 수 있습니다.
- 메인액티비티에서 프리퍼런스를 이용해 데이터 저장 및 가져오기
메인 액티비티에서 프리퍼런스 저장소를 얻는 방법은 아래와 같습니다.
Activity.getPreference(int mode)
Context.getSharedPreferences(String name, int mode)
첫번째는 액티비티단위로 데이터를 저장할때 호출하며 아래는 앱 전체의 프리퍼런스를 얻어올때 사용합니다. 이 장에서는 공유된 프리퍼런스를 사용해보겠습니다.
val sharedPref = getSharedPreference("test", Context.MODE_PRIVATE)
위처럼 앱전체의 프리퍼런스 저장소를 얻어온 후에 아래와 같은 함수로 프리퍼런스에 저장할 수 있습니다.
sharedPref.edit().run{
putString("data1", "hello")
putInt("data2", 20)
commit()
}
이후 데이터를 가져오는 건 아래와 같이 합니다.
val data1 = sharedPref.getString("data1", "")
val data2 = sharedPref.getInt("data2", )
- 앱 설정화면 만들기
공유된 프리퍼런스를 이용하면 앱의 설정화면을 간단하게 만들 수 있습니다.이는 제트팩의 API중 하난인 preference를 이용하는 방법으로 사용을 선언해줘야합니다.
implementation 'androidx.preference:preference-ktx:1.2.0'
implementation 'androidx.preference:preference:1.2.0'
프리퍼런스 API를 이용할때는 프래그먼트로 설정화면을 만들고 메인액티비티에 프래그먼트를 뿌려줘야합니다. 먼저, 프리퍼런스를 담을 프래그먼트를 만들어보겠습니다.
<settings.xml>
res>xml 폴더에 settings.xml 파일을 만들어줍니다. 꼭 xml 폴더이여야합니다. 아래는 settings.xml 파일입니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreferenceCompat
app:key="notification"
app:title="Enable message notification"/>
<Preference
app:key="feedback"
app:title="Send feedback"
app:summary="Report technical issues or suggest new features" />
<EditTextPreference
app:key="id"
app:title="ID"/>
</androidx.preference.PreferenceScreen>
위처럼 작성하면,
이렇게 화면이 나옵니다.
<MySettingFragment.kt>
이제 프래그먼트를 나오게해줄 kt파일을 만들어줍니다.
package com.example.preference
import android.content.Context
import android.os.Bundle
import android.text.TextUtils
import androidx.preference.EditTextPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager
import androidx.preference.SwitchPreference
import com.example.preference.databinding.ActivityMainBinding
import java.security.AccessController.getContext
class MySettingFragment: PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
val idPreference: EditTextPreference? = findPreference("id")
idPreference?.summaryProvider =
Preference.SummaryProvider<EditTextPreference> {preference ->
val text = preference.text
if(TextUtils.isEmpty(text)){
"not value"
}
else{
text
}
}
}
}
onCreatePreferences함수는 무조건 오버라이딩해줍니다. 또한 SummaryProvider은 설정을 변경하였을때 그 설정값을 보여주는 역할을 합니다. 아까 사진에서 ID값을 nova에서 다른걸로 변경하면 변경된값을 화면에 뿌려줍니다.
<메인액티비티.xml>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/main_fragment"
android:layout_margin="16dp"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<메인 액티비티.kt>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val Binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(Binding.root)
//view Fragment
var manage = supportFragmentManager.beginTransaction()
manage.replace(R.id.main_fragment, MySettingFragment()).commit()
}
}
이렇게 작성후 실행시켜보면 아래처럼 나옵니다.
'Programming > Kotlin - Android' 카테고리의 다른 글
안드로이드 앱 프로그래밍 - 37(http 통신하기) (0) | 2023.03.07 |
---|---|
안드로이드 앱 프로그래밍 - 36(스마트폰 정보 구하기) (0) | 2023.03.06 |
안드로이드 앱 프로그래밍 - 34(파일에 보관하기) (0) | 2023.03.01 |
안드로이드 앱 프로그래밍 - 33(데이터베이스에 보관하기) (0) | 2023.02.28 |
안드로이드 앱 프로그래밍 - 32(안드로이드 기본앱과 연동하기) (0) | 2023.02.27 |