본문 바로가기
2019 - 깡샘의 안드로이드 프로그래밍 - 루비페이퍼

PreferenceScreen deprecated

by 들풀민들레 2020. 3. 30.

 

하나의 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;
    }


}