PreferenceFragment使用

本文详细介绍Android应用中使用PreferenceFragment进行偏好设置的方法,包括如何创建GeneralPreferenceFragment类,配置XML文件,以及实现分类和页面跳转等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PreferenceFragment

在Android3.0之前,设置界面使用PreferenceActivity,在Android3.0之后,官方推荐使用PreferenceFragment,对应于碎片化技术。

使用

新建Fragment

新建GeneralPreferenceFragment 继承PreferenceFragment,加载选项配置xml文件。

public static class GeneralPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_general);
            setHasOptionsMenu(true);

            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
            // to their values. When their values change, their summaries are
            // updated to reflect the new value, per the Android Design
            // guidelines.
            bindPreferenceSummaryToValue(findPreference("example_text"));
            bindPreferenceSummaryToValue(findPreference("example_list"));
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                startActivity(new Intent(getActivity(), SettingsActivity.class));
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
新建xml文件

在res文件夹目录下新建xml文件夹,在xml文件夹新建pref_general.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <SwitchPreference
        android:defaultValue="true"
        android:key="example_switch"
        android:summary="@string/pref_description_social_recommendations"
        android:title="@string/pref_title_social_recommendations" />

    <!-- NOTE: EditTextPreference accepts EditText attributes. -->
    <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
    <EditTextPreference
        android:capitalize="words"
        android:defaultValue="@string/pref_default_display_name"
        android:inputType="textCapWords"
        android:key="example_text"
        android:maxLines="1"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:title="@string/pref_title_display_name" />

    <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
         dismiss it. -->
    <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
    <ListPreference
        android:defaultValue="-1"
        android:entries="@array/pref_example_list_titles"
        android:entryValues="@array/pref_example_list_values"
        android:key="example_list"
        android:negativeButtonText="@null"
        android:positiveButtonText="@null"
        android:title="@string/pref_title_add_friends_to_messages" />

</PreferenceScreen>

  • PreferenceScreen:根标签。
  • SwitchPreference:开关标签
  • EditTextPreference:编辑标签
  • ListPreference:集合标签,多选一。
效果图

在这里插入图片描述

分类

使用PreferenceCategory标签进行分类。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">


    <!-- NOTE: EditTextPreference accepts EditText attributes. -->
    <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
    <PreferenceCategory
        android:key="@string/pref_header_mqtt"
        android:summary="@string/pref_header_mqtt"
        android:title="@string/pref_header_mqtt">
        <EditTextPreference
            android:capitalize="characters"
            android:defaultValue="@string/pref_defult_mqtt_ip"
            android:inputType="textCapWords"
            android:key="@string/pref_key_mqtt_ip"
            android:maxLines="1"
            android:selectAllOnFocus="true"
            android:singleLine="true"
            android:title="@string/pref_title_mqtt_ip"
            android:summary="@string/pref_defult_mqtt_ip" />

        <EditTextPreference
            android:capitalize="characters"
            android:defaultValue="@string/pref_defult_mqtt_port"
            android:inputType="textCapWords"
            android:key="@string/pref_key_mqtt_port"
            android:maxLines="1"
            android:selectAllOnFocus="true"
            android:singleLine="true"
            android:title="@string/pref_title_mqtt_port"
            android:summary="@string/pref_defult_mqtt_port" />

        <EditTextPreference
            android:capitalize="characters"
            android:defaultValue="@string/pref_defult_mqtt_topic"
            android:inputType="textCapWords"
            android:key="@string/pref_key_mqtt_topic"
            android:maxLines="1"
            android:selectAllOnFocus="true"
            android:singleLine="true"
            android:title="@string/pref_title_mqtt_topic"
            android:summary="@string/pref_defult_mqtt_topic"
            />

        <EditTextPreference
            android:capitalize="characters"
            android:defaultValue="@string/pref_defult_mqtt_user"
            android:inputType="textCapWords"
            android:key="@string/pref_key_mqtt_user"
            android:maxLines="1"
            android:selectAllOnFocus="true"
            android:singleLine="true"
            android:title="@string/pref_title_mqtt_user"
            android:summary="@string/pref_defult_mqtt_user"
            />

        <EditTextPreference
            android:capitalize="characters"
            android:defaultValue="@string/pref_defult_mqtt_pswd"
            android:inputType="textCapWords"
            android:key="@string/pref_key_mqtt_pswd"
            android:maxLines="1"
            android:selectAllOnFocus="true"
            android:singleLine="true"
            android:title="@string/pref_title_mqtt_pswd"
            android:summary="@string/pref_defult_mqtt_pswd"
            />
    </PreferenceCategory>
</PreferenceScreen>

使用Header跳转页面

使用preference-headers进行实现,在res/xml文件夹新建pref_headers.xml

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- These settings headers are only used on tablets. -->

    <header
        android:fragment="com.pax.preference.SettingsActivity$GeneralPreferenceFragment"
        android:icon="@drawable/ic_info_black_24dp"
        android:title="@string/pref_header_general" />

    <header
        android:fragment="com.pax.preference.SettingsActivity$NotificationPreferenceFragment"
        android:icon="@drawable/ic_notifications_black_24dp"
        android:title="@string/pref_header_notifications" />

    <header
        android:fragment="com.pax.preference.SettingsActivity$DataSyncPreferenceFragment"
        android:icon="@drawable/ic_sync_black_24dp"
        android:title="@string/pref_header_data_sync" />

</preference-headers>

在Activity中设置xml

@Override
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.pref_headers, target);
    }

进行平板适配,这种方式可以适配平板显示。

private static boolean isXLargeTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
    }

平板显示效果
在这里插入图片描述
手机显示效果
在这里插入图片描述

致谢

感谢观看,欢迎评论和点赞!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值