CheckBox选中状态改变

这里写自定义目录标题

  • CheckBox选中状态改变
    • 一、背景
    • 二、源码分析
    • 三、总结:

CheckBox选中状态改变

一、背景

分配了一个编写checkbox通用控件的任务,有一个要求是希望可以在状态发生改变的时候去拦截

在网上没有找到比较有价值的参考,导师给了些思路,现在来分析一下checkbox点击之后的整个流程

二、源码分析

继承关系

CheckBox -> CompoundButton -> Button -> TextView -> View

其中,CompoundButton实现了Checkable接口,推测选中事件是在CompoundButton中具体实现的

CompoundButton重要属性和方法:

    private boolean mChecked;
    private OnCheckedChangeListener mOnCheckedChangeListener;
    private OnCheckedChangeListener mOnCheckedChangeWidgetListener;

    @Override
    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            ......
            mChecked = checked;  //控件状态真实改变
            refreshDrawableState(); //状态改变了要更新显示的资源
            ......
            mBroadcasting = true;    //不是很明白这里为什么要先true 后 false
            if (mOnCheckedChangeListener != null) {
                mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
            }
            if (mOnCheckedChangeWidgetListener != null) {
                mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
            }
            ......
            mBroadcasting = false;
        }
    }
    
    @Override
    public void toggle() { //控件状态改变
        setChecked(!mChecked);
    }
    
    @Override
    public boolean performClick() { //执行点击事件的常规操作,问题是 它是从何处调用的
        toggle();
        ......
    }
    
    @Override
    public boolean isChecked() {
        return mChecked;
    }

三、总结:

控件的选中状态改变是在setChecked()方法中,有三种方法调用setChecked()

  1. 直接调用
  2. toggle()调用
  3. peformClick()调用toggle()间接调用

你可能感兴趣的:(安卓基础,安卓踩坑合集,android)