PreferenceActivity 偏好设置
阅读原文时间:2021年04月20日阅读:2

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:entries

list中的序列(指向一个array)

android:entryValues

list中每个entry对应的值 既在sharePreference中(key-value)中的value


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


xml属性

值的含义

android:entries

list中的序列(指向一个array)

android:entryValues

list中每个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);

    }