AndroidX에서 사용할 수 있는 우선 활동 이야기를 만들었습니다.

우선 활동 편하죠?


XML에서 설정 항목을 정의함으로써 설정 화면을 간단하게 만들 수 있다.API Level15에서 설정 화면을 직접 만들어 deprecated가 된 후에도 PreferenceFragment와 조합하여 사용한다.하지만 드디어 API 레벨 29에서 deprecated가 되었습니다.
Fragment는 AndroidX에서 Preference Fragment Compat를 제공했지만 Preference Activity의 대체 방법은 제공하지 않았다.
없었으면 좋았을 텐데 그래서 (얼마 전) 했어요.PreferenceActivityCompat.
jCenter를 등록했기 때문에 아래와 같이 사용할 수 있습니다.
implementation 'net.mm2d:preference:0.1.2'
Android 4.x에도 재료 디자인을 적용합니다.
PreferenceActivity
PreferenceActivityCompat


원래 기본 설정 활동의 모든 기능을 지원하는 것이 아니라 정의preference-headers 및 호출PreferenceFragment 시 호출할 수 있습니다PreferenceFragmentCompat.
또 실제 설정 항목 등은 PreferenceFragmentCompat에 맡기고 PreferenceFragmentCompat 자체의 개선이 아니다.

사용 방법


얼마 전 Android Studio에서 Setting Activity를 만든 후 무단 제작AppCompatPreferenceActivity을 사용한 설정 화면을 졸작PreferenceActivityCompat으로 바꿨다.(거의 번역)

1. 기본 설정 이벤트 테마에 preferenceTheme 추가

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

+        <item name="preferenceTheme">@style/PreferenceCompatTheme</item>
    </style>

2. 설정 활동의 상위 클래스 다시 쓰기

- public class SettingsActivity extends AppCompatPreferenceActivity {
+ public class SettingsActivity extends PreferenceActivityCompat {
나는 isValidFragmentprotected에서 정의된 것이라고 생각해서 public로 개작했다.
    @Override
-     protected boolean isValidFragment(final String fragmentName) {
+     public boolean isValidFragment(final String fragmentName) {
덮어쓰는 경우 onMenuItemSelected 로 덮어씁니다.
    @Override
-    public boolean onMenuItemSelected(int featureId, MenuItem item) {
+    public boolean onOptionsItemSelected(final MenuItem item) {
        final int id = item.getItemId();
        if (id == android.R.id.home) {
-            if (!super.onMenuItemSelected(featureId, item)) {
+            if (!super.onOptionsItemSelected(item)) {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        }
-        return super.onMenuItemSelected(featureId, item);
+        return super.onOptionsItemSelected(item);
    }

3. onOptionsItemSelected를 PreferenceFragment로 변경

PreferenceFragmentCompat에 쓰인 처리는 onCreate로 변경되었습니다.
-     public static class GeneralPreferenceFragment extends PreferenceFragment {
+     public static class GeneralPreferenceFragment extends PreferenceFragmentCompat {
        @Override
-         public void onCreate(final Bundle savedInstanceState) {
-             super.onCreate(savedInstanceState);
+         public void onCreatePreferences(final Bundle savedInstanceState,final String rootKey) {
            addPreferencesFromResource(R.xml.native_pref_general);
        }

4. 가져오기 다시 쓰기

onCreatePreferences을(를) android.preference.PreferenceActivity.Header로 교체합니다.
- import android.preference.PreferenceActivity.Header;
+ import net.mm2d.preference.Header;
net.mm2d.preference.Headerandroid.preference로 변경합니다.
- import android.preference.ListPreference;
- import android.preference.Preference;
- import android.preference.Preference.OnPreferenceChangeListener;
- import android.preference.PreferenceFragment;
- import android.preference.PreferenceManager;
+ import androidx.preference.ListPreference;
+ import androidx.preference.Preference;
+ import androidx.preference.Preference.OnPreferenceChangeListener;
+ import androidx.preference.PreferenceFragmentCompat;
+ import androidx.preference.PreferenceManager;

5. xml의namespace 다시 쓰기

androidx.preference로 정의된 xml의namespace를 preference-headers에서 android로 변경합니다.
<preference-headers
-     xmlns:android="http://schemas.android.com/apk/res/android">
+     xmlns:app="http://schemas.android.com/apk/res-auto">
    <header
-         android:fragment="net.mm2d.preference.sample.SettingsActivity$GeneralPreferenceFragment"
-         android:icon="@drawable/ic_info_black_24dp"
-         android:title="@string/pref_header_general"
+         app:fragment="net.mm2d.preference.sample.SettingsActivity$GeneralPreferenceFragment"
+         app:icon="@drawable/ic_info_black_24dp"
+         app:title="@string/pref_header_general"
        />

6. 앱을 SwitichPreference(필요한 경우)로 변경

SwitchPreferenceCompat교환만 가능하기 때문에 PreferenceFragmentCompat과는 무관하다.
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-     <SwitchPreference
+     <!--suppress AndroidElementNotAllowed -->
+     <SwitchPreferenceCompat
        android:defaultValue="true"
        android:key="example_switch"
        android:summary="@string/pref_description_social_recommendations"
        android:title="@string/pref_title_social_recommendations"
        />
왜 교체해야 하나요? 안드로이드 4.4 이전에는 Switch Preference 상태를 유지하면 소재 디자인이 될 수 없기 때문입니다.
SwitchPreference
SwitchPreferenceCompat


다만, 경고를 보내는 것은 아름답지 않다

7. 아이콘의margin이 필요하지 않으면 기본 설정 활성 구성 요소를 추가합니다


이것도 사용app:iconSpaceReserved="false"할 때 한 말PreferenceFragmentCompat이니 상관없다.
    <Preference
        android:title="@string/pref_title_system_sync_settings"
+         app:iconSpaceReserved="false"
        >
기본적으로 아이콘의 공백이 나타납니다.PreferenceActivityCompat 장착 가능.
defaultapp:iconSpaceReserved="false"

총결산


이전의 우선 활동이 연장될 수 있는 라이브러리를 만들어 보았다고 소개했다.

좋은 웹페이지 즐겨찾기