๐ SeSAC์ 'JetPack๊ณผ Kotlin์ ํ์ฉํ Android App ๊ฐ๋ฐ' ๊ฐ์ข๋ฅผ ์ ๋ฆฌํ ๊ธ ์ ๋๋ค.
๋ก์ปฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
File Read/Write
SharedPreference
Database (DBMS)
์ธ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ์ฐ์ธ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ธฐ๊ธฐ๋ ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ
๊ฐ ๊ฐ๋ฅํ๋ค. ๋๋ฌธ์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ด๋ ์์ฑํ ํ์ผ์ ์ ์ฅ๋๊ณ ๋ค์ ์ฝ์ด ์ฌ ์ ์๋ค. ๊ทธ๋ผ ๊ทธ๋ฅ File Read/Write
๋ฐฉ๋ฒ์ผ๋ก ๋ค ํ์น๋ฉด ๋๋ ๊ฒ ์๋๋?
์ ์ฅํ๋ ๋ฐ์ดํฐ๊ฐ ๋ฌธ์์ด, Boolean ๊ฐ, ์ซ์๊ฐ ๋ฑ์ด๋ผ๋ฉด File Read/Write
๊ฐ ์๋ SharedPreference
๋ Database
๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๋ฌผ๋ก File Read/Write
๋ก๋ ๊ฐ๋ฅํ์ง๋ง, SharedPreference
์ Database
์ชฝ์ด ํจ์ฌ ์ฝ๋ค.
File Read/Write
๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์ฌ์ฉํ๋ค. ํนํ ์นด๋ฉ๋ผ ์ฑ์ ๋ค๋ฃฌ ๋ ๋ง์ด ์ฌ์ฉํ๋ค.
๐ [์ฐธ๊ณ ]
์์์ฑ(persistence)์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ํ๋ก๊ทธ๋จ์ ์คํ์ด ์ข ๋ฃ๋๋๋ผ๋ ์ฌ๋ผ์ง์ง ์๋ ๋ฐ์ดํฐ์ ํน์ฑ์ ์๋ฏธํ๋ค.
SharedPreference
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ๋ก๊ทธ๋๋ฐ
๋ ๊ฒฐ๊ตญ File ๊ณผ ๊ด๋ จ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋
๋ง ์งง๊ฒ ์ดํด๋ณด์.
์๋ฐ API ๋ก File Read/Write
File : ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์นญํ๋ ํด๋์ค
FileInputStream / FileOutputStream : ํ์ผ์์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ํด๋์ค
FileReader / FileWriter : ํ์ผ์์ ๋ฌธ์์ด ์คํธ๋ฆผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๋ ํด๋์ค
ํ์ผ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ํ ๋ ๋ด์ฅ ๋ฉ๋ชจ๋ฆฌ์ธ์ง ์ธ์ฅ ๋ฉ๋ชจ๋ฆฌ์ธ์ง ๊ตฌ๋ณํด์ผ ํ๋ค.
ํ์ผ์ด ์ ์ฅ๋๋ ๊ณณ์ ๋ด์ฅ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
๊ณผ ์ธ์ฅ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
์ผ๋ก ๊ตฌ๋ถ
์ธ์ฅ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฑ๋ณ ์ ์ฅ๊ณต๊ฐ๊ณผ ๊ณต์ ์ ์ฅ๊ณต๊ฐ์ผ๋ก ๊ตฌ๋ถ
val file = File(filesDir, "test.txt")
val writeStream: OutputStreamWriter = file.writer()
writeStream.write("hello world")
writeStream.flush()
๋ด์ฅ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ ์ฑ์ด ์ค์น๋๋ฉด ์์คํ ์์ ์๋์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
์ฑ์ ํจํค์ง๋ช ์ผ๋ก ํด๋๋ฅผ ๋ง๋ค์ด ์ฃผ๋ฉฐ ์ด ํด๋๊ฐ ์ด ์ฑ์ ๋ด์ฅ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
filesDir
๋ผ๋ ํ๋กํผํฐ๋ก ๋ด์ฅ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์ง์ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ ํํ๋ก ์ ์ฅ (Map)
๋ด๋ถ์ ์ผ๋ก ๋ด์ฅ ๋ฉ๋ชจ๋ฆฌ์ ์ฑ ํด๋์ XML ํ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ
XML ํํ๋ก ํ์ผ์ด ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง ์ ์ฅ์๋ ์ ํฉํ์ง ์๋ค.
2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
ํ๋์ ์กํฐ๋นํฐ๋ฅผ ์ํ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ชฉ์ , ๋๋ฌธ์ ๋งค๊ฐ๋ณ์์ ํ์ผ๋ช ์ด ์๋ค.
์ด ํจ์๋ฅผ ์ด์ฉํ ์กํฐ๋นํฐ ํด๋์ค๋ช ์ผ๋ก XML ํ์ผ๋ช ์ด ๋ง๋ค์ด ์ง
์ฆ, ์ดํ๋ฆฌ์ผ์ด์
์ ์ญ์ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ชฉ์ ์ผ๋ก ํ์ง ์๋๋ค. ๊ทธ๋์ SharedPreference ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
val sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
์ฑ ์ ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ ํํ๋ก ์ ์ฅ
๋ฒ์๊ฐ ์ ์ญ์ด๊ธฐ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์์ ํ์ผ๋ช
์ด ๋ค์ด๊ฐ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ SharedPreferences.Editor ํด๋์ค์ ํจ์๋ฅผ ์ด์ฉํ๋ค.
SharedPreferences.Editor ๊ฐ์ฒด๋ SharedPreferences ์ edit() ํจ์๋ก ํ๋ํ๋ค.
commit() ํ๋ ์๊ฐ ์ ์ฅ๋๋ค.
putBoolean(String key, Boolean value)
putInt(String key, Int value)
putFloat(String key, Float value)
putLong(String key, Long value)
putString(String key, String value)
๋ฐ์ดํฐ ํ๋์ SharedPreferences ์ getter ํจ์๋ฅผ ์ด์ฉํ๋ค.
getBoolean(String key, Boolean defvalue)
getInt(String key, Int defvalue)
getFloat(String key, Float defvalue)
getLong(String key, Long defvalue)
getString(String key, String defvalue)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/editView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="check" />
<Button
android:id="@+id/saveButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SAVE" />
<Button
android:id="@+id/getButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get Data" />
<TextView
android:id="@+id/resultView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
package com.kotdev99.android.c55
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val editView = findViewById<EditText>(R.id.editView)
val checkView = findViewById<CheckBox>(R.id.checkView)
val saveButton = findViewById<Button>(R.id.saveButton)
val getButton = findViewById<Button>(R.id.getButton)
val resultView = findViewById<TextView>(R.id.resultView)
val sharedPref = getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
saveButton.setOnClickListener {
sharedPref.edit().run {
putString("data1", editView.text.toString())
putBoolean("data2", checkView.isChecked)
commit()
}
}
getButton.setOnClickListener {
val data1 = sharedPref.getString("data1", "none")
val data2 = sharedPref.getBoolean("data2", false)
resultView.text = "data1: ${data1}, data2: ${data2}"
}
}
}
์ฑ์ ํ๊ฒฝ์ค์ ์๋ํ๋ฅผ ๋ชฉ์ ์ผ๋ก ํ๋ค.
์ฑ์ ๋ํ ํ๊ฒฝ์ค์ ์ ์ํด์๋ ์ฐ์ ์ค์ ์ ์ถ๋ ฅํ ์กํฐ๋นํฐ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๊ฒฝ์ค์ ์กํฐ๋นํฐ์์ ๋ฐ์ํ ์ ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๊ธฐ์ ์์์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ค.
์ฆ, UI ์กํฐ๋นํฐ + ์ ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ + Persistence
๋ฅผ ๋! ์ถ๊ฐ๋ก! ๊ตฌํํด์ผ ํ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง Settings XML
์ ์ฌ์ฉํ๋ฉด ์์ ๊ณผ์ ์ด ์๋ํ ๋๋ค. ์ผ์ผํ ์กํฐ๋นํฐ UI๋ฅผ ๊ตฌ์ฑํ์ง ์์๋, ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑํ์ง ์์๋, ์์์ ์ ์ฅ ์ฝ๋๋ฅผ ์ง์ง ์์๋, Settings XML
์ด ์์์ ๋ง๋ค์ด ์ค๋ค. ๋ฌผ๋ก SharedPreference๋ก ํ๊ฒฝ์ค์ ์ ๊ตฌํํ ์๋ ์๋ค.
implementation("androidx.preference:preference-ktx:1.2.0")
์ฑ ์ค์ ์ ์ํ XML ์์ฑ
API Level 29 ์ด์ ๋ฒ์ ์์๋ PreferenceFragment ์ ์ด์ฉ
API Level 29 ๋ฒ์ ๋ถํฐ AndroidX Preference
๋ฅผ ์ด์ฉํ ๊ฒ์ ๊ถ์ฅ
ํ๊ฒฝ์ค์ ์ ์ํ ํน์ ๋๋ ํ ๋ฆฌ๋ ์๋ค. xml ํด๋์ ์งฌ ๋๋ฆฌ๋ฉด ๋๋ค.
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<SwitchPreferenceCompat
app:key="notifications"
app:title="Enable message notifications"/>
</PreferenceScreen>
๋ฃจํธ ํ๊ทธ๊ฐ <PreferenceScreen>
<SwitchPreferenceCompat>
, <Preference>
๋ฑ์ ํ๊ทธ๋ฅผ ์ด์ฉํด ๊ฐ๊ฐ์ ์ค์ ํญ๋ชฉ์ ์ค๋น
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
}
}
PreferenceFragmentCompat ์ ์์๋ฐ์ Fragment ๋ก ์ค์ XML ์ ์ฉ
๋งค๊ฐ๋ณ์ R.xml.settings
์ ์ค์ XML ํ์ผ๋ง ์ง์ ํ๋ฉด ๋
PreferenceScreen : ์ค์ ํ๋ฉด๋จ์. ์ค์ฒฉ ๊ฐ๋ฅํ๋ฉฐ ์ค์ฒฉ๋ ๋ด์ฉ์ ๋ณ๋์ ํ๋ฉด์ ๋์ด.
PreferenceCategory : ์ค์ ์ฌ๋ฌ๊ฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ฌถ์ด์ ํํ
CheckboxPreference : ์ฒดํฌ๋ฐ์ค๊ฐ ๋์ค๋ ์ค์
EditTextPreference : ๊ธ ์
๋ ฅ์ ์ํ ์ค์
ListPreference : ํญ๋ชฉ Dialog ์ ์ํ ์ค์
MultiSelectListPreference : ํญ๋ชฉ Dialog ์ธ๋ฐ ์ฒดํฌ๋ฐ์ค๊ฐ ์๋ ์ถ๊ฐ๋์ด ๋ค์ค ์ ํ ๊ฐ๋ฅ
RingtonPreference : Rington ์ ํ์ ์ํ ์ค์
SwitchPreference : Switch ์ ์ด์ฉํ ์ค์
res/xml ํ์์ ํ๊ฒฝ์ค์ XML ํ์ผ ์์ฑ
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory>
app:key="a_category"
app:title="A Setting">
<SwitchPreferenceCompat
app:key="a1"
app:title="A - 1 Setting" />
<SwitchPreferenceCompat
app:key="a2"
app:title="A - 2 Setting" />
</PreferenceCategory>
<PreferenceCategory>
app:key="B_category"
app:title="B Setting">
<SwitchPreferenceCompat
app:key="b1"
app:title="B - 1 Setting" />
</PreferenceCategory>
</PreferenceScreen>
XML ํ์ผ์ ์ ์ฉํ ํ๋๊ทธ๋จผํธ๋ฅผ ๋์ธ ์กํฐ๋นํฐ ๋ ์ด์์ ์์ฑ
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.kotdev99.android.c56.SettingsFragment" />
XML ํ์ผ์ ์ ์ฉํ ํ๋๊ทธ๋จผํธ ์์ฑ
package com.kotdev99.android.c56
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
}
}
์ค์ ์ ์ํ XML ๋ง ๋ง๋ค์ด ์ ์ฉ์์ผ ์ฃผ๋ฉด ์ค์ ํ๋ฉด์ด ๋์ค๊ณ ์ ์ ๊ฐ ์ค์ ํญ๋ชฉ์ ํด๋ฆญํ๋ฉด ์ค์ ๋ด์ฉ์ด ์๋์ผ๋ก ์ ์ฅ
์ด๋ค ๊ฒฝ์ฐ์๋ ์ค์ XML ์ ์ค์ ๋ถ๋ถ์ ์ฝ๋์์ ์ ์ด ํ์
์ค์ ํญ๋ชฉ์ ํด๋ฆญํ๋ ์๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ๊ฑฐ๋ ์ฝ๋๊ฐ ์คํ๋์ด ๋ฐ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ํญ๋ชฉ์ title ํน์ summary ๋ก ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ
Settings XML ์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ด์ธ์ ํ์ํ๋ค๋ฉด ์ฌ์ฉํ์.
<EditTextPreference
android:key="id"
android:title="ID ์ค์ "
android:isPreferenceVisible="false"/>
val idPreference: EditTextPreference? = findPreference("id")
idPreference?.isVisible = true
์ค์ ํญ๋ชฉ์ ์ ํํ ํ์๋ "ํญ๋ชฉ์ ์ ํ ํด์ฃผ์ธ์" ๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋๋ฉด ๋ฌด์ธ๊ฐ ์ด์ํ๋ค.
๊ทธ๋์ ์ด๋ฏธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Summary ๊ฐ์ ์๋์ผ๋ก ๋ณ๊ฒฝ์ฃผ๋ ํด๋์ค๊ฐ ์ค๋น๋์ด ์๋ค.
soundPreference!!.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance())
<EditTextPreference>
, <ListPreference>
์ ์ํ ์ค์ ํ ๊ฐ ํ๋ฉด์ ์ถ๋ ฅ
SimpleSummaryProvider ์ด์ฉ
SimpleSummaryProvider
๋ ์ ์ ๊ฐ ์
๋ ฅํ ๊ฐ์ ์๋์ผ๋ก Summary ์ ์จ์ค๋ค.
idPreference?.summaryProvider=
Preference.SummaryProvider<EditTextPreference> { preference ->
val text = preference.text
if (TextUtils.isEmpty(thext)) {
"์ค์ ์ด ๋์ง ์์์ต๋๋ค."
} else {
"์ค์ ๋ ID๊ฐ์ : $text ์
๋๋ค."
}
}
์ ์ ๊ฐ ์ค์ ํญ๋ชฉ์ ๋๋ฅด๋ ์๊ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
idPreference?.setOnPreferenceClickListener {
true
}
setOnPreferenceClickListener()
์ ์ด์ฉํด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ง์ ์ ์ ๊ฐ ์ค์ ๊ฐ์ ๋ณ๊ฒฝํ ์๊ฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
idPreference?.setOnPreferenceChangeListener { preference, newValue ->
Log.d("kotdev", "preference key : ${preference.key}, newValue : $newValue")
true
}
์ ์ ๊ฐ ์ค์ ์ ๋ณ๊ฒฝํ ์๊ฐ์ ๊ฐ์งํด ๋ณ๊ฒฝํ ๊ฐ์ ์ด์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
Preference.OnPreferenceChangeListener ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ Preference ๊ฐ์ฒด์ ์ ์ฉ
SharedPreferences.OnSharedPreferenceChangeListener ๋ ๋ชจ๋ ์ค์ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ํ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ ๊ฐ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
์ค์ ํ ๊ฐ์ด ๋งค๊ฐ๋ณ์ newValue
๋ก ๋์ด์จ๋ค.
res/xml ํ์์ ํ๊ฒฝ์ค์ XML ํ์ผ ์์ฑ
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreferenceCompat
android:key="serverFlag"
android:summaryOff="์๋ฒ ์ฐ๋์ด ๋นํ์ฑํ ๋์ด ์์ต๋๋ค"
android:summaryOn="์๋ฒ ์ฐ๋์ด ํ์ฑํ ๋์ด ์์ต๋๋ค"
android:title="์๋ฒ์ฐ๋" />
<PreferenceCategory
android:dependency="serverFlag"
android:title="์๋ฒ์ฐ๋์ ๋ณด">
<EditTextPreference
android:key="serverId"
android:title="ID" />
<ListPreference
android:entries="@array/array_voice"
android:entryValues="@array/array_voice"
android:key="sound_list"
android:title="์๋ฒ ๋ฉ์์ง ์๋ฆผ์" />
</PreferenceCategory>
</PreferenceScreen>
ListPreference ํญ๋ชฉ์ ์ถ๋ ฅํ ๋ฌธ์์ด ๋ฐฐ์ด์ XML ํ์ผ๋ก ์์ฑ. res/values ํ์์ ์์ฑํ๋ค.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="array_voice">
<item>์นดํก</item>
<item>์นดํก์์</item>
<item>์นด์นด์คํก</item>
</string-array>
</resources>
XML ํ์ผ์ ์ ์ฉํ ํ๋๊ทธ๋จผํธ๋ฅผ ๋์ธ ์กํฐ๋นํฐ ๋ ์ด์์ ์์ฑ
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
class="com.kotdev99.android.c57.SettingFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
XML ํ์ผ์ ์ ์ฉํ ํ๋๊ทธ๋จผํธ ์์ฑ
package com.kotdev99.android.c57
class SettingFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
val idPreference = findPreference<EditTextPreference>("serverId")
val soundPreference = findPreference<ListPreference>("sound_list")
idPreference?.setOnPreferenceChangeListener { preference, newValue ->
Toast.makeText(activity, "$newValue", Toast.LENGTH_SHORT).show()
true
}
soundPreference!!.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
idPreference!!.summaryProvider =
Preference.SummaryProvider<EditTextPreference> { preference ->
val text = preference.text
if (TextUtils.isEmpty(text)) {
"์ค์ ๋์ง ์์์ต๋๋ค"
} else {
"์ค์ ๋ id ๊ฐ์ $text ์
๋๋ค."
}
}
}
}