写好一个Preference的大局观

1. 一个完整的Preference由两部分组成,一个继承自Preference的类(比如系统已定义的CheckBoxPreference或自定义CustomPreference)和放置相应配置信息的XML文件(包括系统已定义标签<PreferenceCategory>,<PreferenceScreen>,<PreferenceGroup>或自定义指向对应CustomPreference类的标签,<CheckBoxPreference>这一类标签等同于自定义标签)。

2.如果仅有Preference,那么可以认为只有了setting的后台内容,即setting的值,结构等等都保存在Preference这一对象这里;setting另外一个重要的部分是UI,从Android3.0之后,UI部分由自定义PreferenceFragment完成

在自定义PreferenceFragment的onCreate(),onActivityCreated()等回调中,我们可以使用addPreferenceFromResource()(或PreferenceScreen,PreferenceGroup等提供的一些方法,参照API)把XML配置信息视图和UI联系起来。

3.只看2好像只需要把配置信息放置到UI中即可完成setting,那么还需要Preference这个类有什么作用呢?我们查看CheckBoxPreference.java源码进行分析。

package android.preference;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Checkable;


public class CheckBoxPreference extends TwoStatePreference {

    public CheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        
        TypedArray a = context.obtainStyledAttributes(attrs,
                com.android.internal.R.styleable.CheckBoxPreference, defStyle, 0);
        setSummaryOn(a.getString(com.android.internal.R.styleable.CheckBoxPreference_summaryOn));
        setSummaryOff(a.getString(com.android.internal.R.styleable.CheckBoxPreference_summaryOff));
        setDisableDependentsState(a.getBoolean(
                com.android.internal.R.styleable.CheckBoxPreference_disableDependentsState, false));
        a.recycle();
    }

    public CheckBoxPreference(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.checkBoxPreferenceStyle);
    }

    public CheckBoxPreference(Context context) {
        this(context, null);
    }

    @Override
    protected void onBindView(View view) {
        super.onBindView(view);

        View checkboxView = view.findViewById(com.android.internal.R.id.checkbox);
        if (checkboxView != null && checkboxView instanceof Checkable) {
            ((Checkable) checkboxView).setChecked(mChecked);
            sendAccessibilityEvent(checkboxView);
        }

        syncSummaryView(view);
    }
}
这里面只有两部分内容——构造函数和onBindView,先看构造函数,setSummaryOn()这个函数对应于属性android:summaryOn,它表示当CheckBoxPreference is Checked时的描述信息

如图中的第二行字。再看onBindView函数,从if中可知它做了check和unCheck这个操作。

总结上述两部分内容,可知Preference所作的是动态操作setting,即用户设置时的操作由它来控制。事实上,它提供了onBindView(),getView()(具体查看API)等与视图相关的操作,还有一些监听操作都在这个类中完成。

总结上述内容,编写一个setting,需要有以下三部分内容:

其中,XML定义了setting结构,CustomPreference完成setting操作,MyPreferenceFragment展现UI视图。

4.对于一些自定义setting,它可能不想系统setting那样是一个列表的形式呈现出来的,系统setting往往如图所示,

那么如果是自定义的如下图所示的setting呢?每一个setting由一个屏(PreferenceScreen)定义,那么这个屏的UI如何与Preference联系起来呢?

这需要我们自定义一个layout,然后在Preference的构造函数中调用setLayoutResource(R.layout.myLayout),然后在getView()中我们可以具体操作这个layout里的控件。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值