PreferenceActivity 偏好设置

本文详细介绍了Android中PreferenceResource的各类组件及其属性,包括Preference的基础属性、DialogPreference和PreferenceGroup的特有属性等。此外还提供了自定义PreferenceCategory的方法及示例。

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

PreferenceResource中各个组件的介绍。
这里写图片描述

Preference的布局在: res/xml/下新建preference.xml
通常是用fragment来显示Preference,然后将fragment加载到activity中
public static class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //将该布局作为activity(或者fragement)的主布局
        addPreferencesFromResource(R.xml.preferences);
    }
    ...
}
//将PreferenceFragment挂载到activity中
public class SettingsActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 将fragement作为activity的content布局 
        getFragmentManager().beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();
    }
}
1.基础类Preference的属性:(所有继承与它的子类都具有以下属性)
xml属性值的含义
android : defaultValue默认初始值
android : icon显示图标
android : key保存到SharePreference文件(key-value)中的key
android : summary内容描述
android : title标题
android : enabled该偏好是否可用(默认为true)不可用时为灰色
android : order排列的优先顺序(值小的排在前面,最小值为0)
android : iconSpaceReserved没有图标时是否保留图标的位置(默认为false)
android : layout偏好的布局(很少使用到,一般用widgetlayout)
android : persistent是否自动储存偏好的值(默认为true)
android : recycleEnabled是否可重复使用(如在ListView中)
android : selectable是否可供选择
android : singleLineTitle标题是否设置为单行(默认为true))
android : widgetLayout偏好的view布局(可以引用theme中的布局)
android : dependency该偏好依赖的其他偏好的Key值

2.抽象类DialogPreference属性:子类继承了他的属性
xml属性值的含义
android : dialogIcon点击时弹出的对话框的图标
android : dialogLayout点击时弹出的对话框的布局
android : dialogMessage点击时弹出的弹出的对话框的描述文字
android : dialogTitle点击时弹出的对话框的标题
android : negativeButtonText点击时弹出的对话框的取消按钮的文字
android : positiveButtonText点击时弹出的对话框的确定按钮的文字

3.抽象类PreferenceGroup的属性:子类继承了他的属性
xml属性值的含义
android : orderingFromXml组的优先顺序

4.PreferenceScreen没有自有属性:(继承自Preference和PreferenceGroup的属性)

作用:
1.作为根节点 在Preference的xml文件中
2.当嵌套在Preferenced的xml中时,可嵌套形成二级设置页面,作为开启第二屏的节点
这里写图片描述

这里写图片描述


5.PreferenceCategory为类别设置没有自有属性:(继承自Preference和PreferenceGroup的属性)

这里写图片描述

更改PreferenceCategory布局的两种方式:

1.设置android:layout="@layout.name"替换布局
2.自定义MyPreferenceCategory类继承于PreferenceCategory

//1.在res/styles中自定义属性
 <declare-styleable name="MyPreferenceCategory">
        <attr name="title" format="string"/>//title用作设置标题
        <attr name="color" format="color"/> //color 用作设置背景颜色
    </declare-styleable>



//2.自定义类
public class MyPreferenceCategory extends PreferenceCategory {
    private String title;
    private int color;

    public MyPreferenceCategory(Context context, AttributeSet attrs) {
        super(context, attrs);
       //将自定义的Layout资源设为它的布局
        setLayoutResource(R.layout.mypreference_category);
         //从xml文件中获取属性值
        TypedArray typedArray = context.obtainStyledAttributes(attrs,  R.styleable.MyPreferenceCategory);
        try {
            //R.styleable.name为自定的属性,需在style中定义
            title = typedArray.getString(R.styleable.MyPreferenceCategory_title);
            color = typedArray.getColor(R.styleable.MyPreferenceCategory_color, context.getResources().getColor(R.color.colorPrimary));
        } finally {
            typedArray.recycle();
        }
    }
    //将自定义的属性赋值给布局中view
    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
        TextView textView = (TextView) view.findViewById(R.id.title);
        View divider = view.findViewById(R.id.divider);
        textView.setText(title);
        divider.setBackgroundColor(color);
    }
}



//3.在res/xml/preference.xml布局文件中引用自定义的MyPreferenceCategory
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.example.wendy.myapplication">
    <!--注意自定义属性的命名空间后缀为包名全称-->
<com.example.wendy.myapplication.MyPreferenceCategory
    custom:title = "Custom PreferenceCategory"
    custom:color = "@color/colorDivider">
    <CheckBoxPreference
        android:defaultValue="true"
        android:icon="@drawable/color"
        android:key="check_pref"
        android:selectable="true"
        android:summaryOff="off"
        android:summaryOn="on"
        android:title="CheckBoxPreference"/>
</com.example.wendy.myapplication.MyPreferenceCategory>

6.CheckBoxPreference的自有属性 : (同时也继承了Preference的属性)

这里写图片描述

xml属性值的含义
android : summaryOff未选择时的偏好描述
android : summaryOn选择时的偏好描述
android:disableDependentsState偏好未选择时需要依赖他的其他偏好处是否处于可用状态(默认为false)

7.SwitchPreference的自有属性:(同时也继承了Preference的属性)

这里写图片描述

xml属性值的含义
android : summaryOff未选择时的偏好描述
android : summaryOn选择时的偏好描述
android:disableDependentsState偏好未选择时需要依赖他的其他偏好处是否处于可用状态(默认为false)
android : switchTextOn选择switchOn时的文本
android : switchTextOff选择switchOff时的文本

8.EditTextPreference 没有自有属性:(继承了Preference和DialogPreference的属性)

这里写图片描述
这里写图片描述


9.ListPreference的自有属性:(同时也继承了Preference和DialogPreference的属性)

这里写图片描述
这里写图片描述

xml属性值的含义
android:entrieslist中的序列(指向一个array)
android:entryValueslist中每个entry对应的值 既在sharePreference中(key-value)中的value

10.MultiSelectListPreference的自有属性:(同时也继承了Preference和DialogPreference的属性)

这里写图片描述
这里写图片描述

xml属性值的含义
android:entrieslist中的序列(指向一个array)
android:entryValueslist中每个entry对应的值 既在sharePreference中(key-value)中的value

11.RingtonePreference的自有属性:(同时继承了Preference的属性)

这里写图片描述
这里写图片描述

xml属性值的含义
android:ringtoneType铃声类别
android:showDefault默认铃声
android:showSilent静音

12.点击某个prefenrence时需要跳转开启其他的activity时的设置:

a.在preferences.xml中增加intent子元素

 <CheckBoxPreference
            android:defaultValue="true"
            android:key="checked_key"
            android:summaryOn="Show a summary for each link"
            android:title="Show Summaries">
            <intent
                android:action="android.intent.action.MAIN"
                android:targetPackage="com.example.wendy.preference"
                android:targetClass="com.example.wendy.preference.Main2Activity"/>
</CheckBoxPreference>

b.在preferenceAcitivity中Override onpreferenceTreeClick方法

 @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
        return false; //返回false才能实现点击跳转
    }

参考Preference点击跳转设置

以上是Preference的xml描述,那么在程序中我们只需要新建一个继承自PreferenceActivity的 Activity,然后在主程序中调用就可以了。Preference中的设置存储是完全自动的,不需要再用代码去实现设置的存储,PreferenceActivity创建后系统会自动创建一个配置文件, /data/data/your_package_name /shared_prefs/(your_package_name)_preferences.xml。自动生成的配置文件如下:

<?xml version ='1.0' encoding ='utf-8' standalone ='yes' ?>
<map>
<string name ="EditTextPreference" >12332312</string>
<string name ="ListPreference" >2</string>
<string name ="RingtonePreference" >content://media/internal/audio/media/10</string>
<boolean name ="CheckBox1" value ="true" />
<boolean name ="CheckBox2" value ="true" />
</map>

文件中的name属性对应xml文件中的key属性表示某一个设置项,值是唯一的,value以及string中间的值表示设置项的具体值。

13.在activity或其他组件中获得Preference 值得方法:
        //获得默认的Preference.xml文件
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        String text = sharedPreferences.getString("edit_pref", "null");//取得Key值对应的Value

Preference的变化监听接口:(当用户改变Preference的选择时,会触发系统调动回调接口)

//创建一个OnSharedPreferenceChangeListener实例,并实现方法逻辑
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                Preference preference = findPreference(key);
                preference.setSummary(sharedPreferences.getString(key, ""));
            }
        };
//获得Preference控件对应的SharePreferences对象,为其注册监听改变接口
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
sharedPreferences.registerOnSharedPreferenceChangeListener(listener);

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值