하나의 xml 내에서 PreferenceScreen을 중첩하여 설정 화면을 여러장으로 분리하여 작성하던 부분이 deprecated 되었다.
API Level 29부터는 동작도 제대로 안되고 이상 반응을 일으킨다.
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="메시지 알림">
<SwitchPreference
android:key="message"
android:title="메시지 알림"/>
<PreferenceScreen
android:key="keyword_screen"
android:title="키워드 알림"
android:summary="사용안함">
<SwitchPreference
android:defaultValue="false"
android:key="keyword"
android:summary="등록된 키워드가 포함된 메시지는 채팅방 알림이 꺼져 있어도 푸시 알림을 받게 되어 키워드는 강조되어 보여 집니다."
android:title="키워드 알림"/>
<ListPreference
android:entries="@array/array_voice"
android:entryValues="@array/array_voice"
android:key="keyword_sound_list"
android:summary="카톡"
android:title="키워드 전용 알림음"
/>
</PreferenceScreen>
<SwitchPreference
android:key="sound"
android:title="소리"/>
<ListPreference
android:entries="@array/array_voice"
android:entryValues="@array/array_voice"
android:key="sound_list"
android:summary="카톡"
android:title="알림음음"
/>
</PreferenceCategory>
</PreferenceScreen>
https://developer.android.com/guide/topics/ui/settings/organize-your-settings#java
에 설명이 나와 있는데..
<Preference
app:fragment="com.example.SyncFragment"
.../>
을 권장한다..
아래처럼 작성하여 테스트 성공했다.
dependencies {
………………………
implementation 'androidx.preference:preference:1.1.0'
}
setting_main.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 android:title="메시지 알림">
<SwitchPreference
android:key="message"
android:title="메시지 알림"/>
<Preference
android:key="keyword_screen"
android:title="키워드 알림1"
android:summary="사용안함"
app:fragment="com.example.androidtest10_20200330.SettingPreferenceFragmentSub"/>
<SwitchPreference
android:key="sound"
android:title="소리"/>
<ListPreference
android:entries="@array/array_voice"
android:entryValues="@array/array_voice"
android:key="sound_list"
android:summary="카톡"
android:title="알림음음"
/>
</PreferenceCategory>
</PreferenceScreen>
setting_sub.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
android:defaultValue="false"
android:key="keyword"
android:summary="등록된 키워드가 포함된 메시지는 채팅방 알림이 꺼져 있어도 푸시 알림을 받게 되어 키워드는 강조되어 보여 집니다."
android:title="키워드 알림"/>
<ListPreference
android:entries="@array/array_voice"
android:entryValues="@array/array_voice"
android:key="keyword_sound_list"
android:summary="카톡"
android:title="키워드 전용 알림음"
android:dependency="keyword"
/>
</PreferenceScreen>
SettingPreferenceFragmentMain
public class SettingPreferenceFragmentMain extends PreferenceFragmentCompat {
SharedPreferences prefs;
Preference soundPreference;
// Preference keywordSoundPreference;
Preference keywordScreen;
@Override
public void onCreatePreferences(Bundle bundle, String s) {
setPreferencesFromResource(R.xml.setting_main, s);
if (s == null) {
soundPreference = findPreference("sound_list");
// keywordSoundPreference = findPreference("keyword_sound_list");
keywordScreen = findPreference("keyword_screen");
prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (!prefs.getString("sound_list", "").equals("")) {
soundPreference.setSummary(prefs.getString("sound_list", "카톡"));
}
if (prefs.getBoolean("keyword", false)) {
keywordScreen.setSummary("사용");
}else {
keywordScreen.setSummary("사용안함");
}
prefs.registerOnSharedPreferenceChangeListener(prefListener);
}
}
SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("sound_list")) {
soundPreference.setSummary(prefs.getString("sound_list", "카톡"));
}
if (key.equals("keyword")) {
if (prefs.getBoolean("keyword", false)) {
keywordScreen.setSummary("사용");
}else {
keywordScreen.setSummary("사용안함");
}
}
}
};
}
SettingPreferenceFragmentSub
public class SettingPreferenceFragmentSub extends PreferenceFragmentCompat {
SharedPreferences prefs;
Preference keywordSoundPreference;
@Override
public void onCreatePreferences(Bundle bundle, String s) {
setPreferencesFromResource(R.xml.setting_sub, s);
if (s == null) {
keywordSoundPreference = findPreference("keyword_sound_list");
prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (!prefs.getString("keyword_sound_list", "").equals("")) {
keywordSoundPreference.setSummary(prefs.getString("keyword_sound_list", "카톡"));
}
prefs.registerOnSharedPreferenceChangeListener(prefListener);
}
}
SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("keyword_sound_list")) {
Log.d("kkang", "keyword_sound_list : "+prefs.getString("keyword_sound_list", "카톡"));
keywordSoundPreference.setSummary(prefs.getString("keyword_sound_list", "카톡"));
}
}
};
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/settings_fragment"
android:name="com.example.androidtest10_20200330.SettingPreferenceFragmentMain"
android:layout_width="match_parent"
android:layout_height="match_parent" />
MainActivity
public class MainActivity extends AppCompatActivity implements
PreferenceFragmentCompat.OnPreferenceStartFragmentCallback{
public static final String TARGET_SETTING_PAGE = "target";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, androidx.preference.Preference pref) {
final Bundle args = pref.getExtras();
final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
getClassLoader(),
pref.getFragment());
fragment.setArguments(args);
fragment.setTargetFragment(caller, 0);
// Replace the existing Fragment with the new Fragment
getSupportFragmentManager().beginTransaction()
.replace(R.id.settings_fragment, fragment)
.addToBackStack(null)
.commit();
return true;
}
}
'2019 - 깡샘의 안드로이드 프로그래밍 - 루비페이퍼' 카테고리의 다른 글
android 10(API Level 29) 에서 21장 Lab 4 Matisse라이브러리 에러 (0) | 2020.04.07 |
---|---|
java.io.FileNotFoundException open failed: EACCES (Permission denied) 문제 (0) | 2020.04.03 |
책 PDF 자료 (0) | 2019.06.15 |
오타 신고 및 책에 대한 문의 (11) | 2019.06.13 |
교재에 담긴 실습 코드 (0) | 2019.06.13 |