외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 35(공유된 프리퍼런스에 보관하기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 35(공유된 프리퍼런스에 보관하기)

Nova_ 2023. 3. 3. 17:19

- 프리퍼런스

공유된 프리퍼런스는 플랫폼 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()

    }
}

이렇게 작성후 실행시켜보면 아래처럼 나옵니다.

Comments