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 {
나는 isValidFragment
은protected
에서 정의된 것이라고 생각해서 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.Header
를 android.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"
총결산
이전의 우선 활동이 연장될 수 있는 라이브러리를 만들어 보았다고 소개했다.
Reference
이 문제에 관하여(AndroidX에서 사용할 수 있는 우선 활동 이야기를 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryo_mm2d/items/8dee5f1aeab62a158e07
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
implementation 'net.mm2d:preference:0.1.2'
얼마 전 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 {
나는 isValidFragment
은protected
에서 정의된 것이라고 생각해서 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.Header
를 android.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
장착 가능.default
app:iconSpaceReserved="false"
총결산
이전의 우선 활동이 연장될 수 있는 라이브러리를 만들어 보았다고 소개했다.
Reference
이 문제에 관하여(AndroidX에서 사용할 수 있는 우선 활동 이야기를 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ryo_mm2d/items/8dee5f1aeab62a158e07
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(AndroidX에서 사용할 수 있는 우선 활동 이야기를 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryo_mm2d/items/8dee5f1aeab62a158e07텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)