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.)