android Settings Activity 구현. kotlin


아래와 같이 액티비티를 추가한다.
Android Studio 
File - New - Activity - Settings Activity 


res - xml 에 root_preferences.xml 와 비슷한 파일명을 열어 아래와 같이 수정한다.
Activity

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">

<PreferenceCategory app:title="@string/messages_header">

<EditTextPreference
app:key="test1"
app:title="@string/signature_title"
app:useSimpleSummaryProvider="true" />

<SeekBarPreference
app:key="test2"
app:title="font sizw"
app:iconSpaceReserved="false"
app:showSeekBarValue="true"
app:defaultValue="15"
app:min="10"
android:max="35"/>

<ListPreference
app:defaultValue="reply"
app:entries="@array/reply_entries"
app:entryValues="@array/reply_values"
app:key="reply"
app:title="@string/reply_title"
app:useSimpleSummaryProvider="true" />

</PreferenceCategory>


</PreferenceScreen>



res - values - arrays.xml 에는 ListPreference의 값이 들어간다. 

<resources>
<!-- Reply Preference -->
<string-array name="reply_entries">
<item>Reply</item>
<item>Reply to all</item>
</string-array>

<string-array name="reply_values">
<item>reply</item>
<item>reply_all</item>
</string-array>
</resources>




Activity 코드.


class SettingsActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.settings_activity)
supportFragmentManager
.beginTransaction()
.replace(R.id.settings, SettingsFragment(preferenceChangeListener))
.commit()
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}

// 설정 저장 후에 호출된다.
val preferenceChangeListener: SharedPreferences.OnSharedPreferenceChangeListener =
SharedPreferences.OnSharedPreferenceChangeListener { var1, key ->
when (key){
"test1", "test2" -> {
val intent: Intent = getIntent()
finish()
startActivity(intent)
}
else -> {
}
}
}


class SettingsFragment(val listener: SharedPreferences.OnSharedPreferenceChangeListener) : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)

// setOnPreferenceChangeListener 설정 저장전에 체크해서 저장할지 선택할 수 있다.
findPreference<ListPreference>("test1")?.setOnPreferenceChangeListener { preference, newValue ->
return@setOnPreferenceChangeListener true
}
}

// OnSharedPreferenceChangeListener를 사용하기 위한 코드.
override fun onResume() {
super.onResume()
preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(listener)
}

override fun onPause() {
super.onPause()
preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener)
}
}

}



설정값을 변경할때 두가지 리스너로 콜백 받을수 있다.

setOnPreferenceChangeListener - 설정 저장전에 체크해서 저장할지 선택할 수 있다.
SharedPreferences.OnSharedPreferenceChangeListener - 설정 저장 후에 호출된다.

getSharedPreferences 로 저장값을 읽어올 수 있다.

저장값을 읽어오는 방법과 폴더는 아래 링크 참조.

댓글

이 블로그의 인기 게시물

파이썬 vscode에서 자동 코드 정렬. Formatter.

Unity3D git 저장소에 올릴때 필요없는 파일 제외하기. gitignore

플러터(flutter) 개발 참고 사이트들.