学而实习之 不亦乐乎

Android:基于回调的事件传播

2022-01-24 09:41:53

一、概述

android为用户提供了两套强大的事件处理机制:
1:基于监听的事件处理
2:基于回调的事件处理

几乎所有基于回调的事件处理方法都有一个boolean类型的返回值,该返回值用于表示该处理方法是否能完全处理该事件。
    如果处理事件的回调方法返回true,表明该处理方法已经完全处理改事件,该事件不会传播出去。
    如果处理事件的回调方法返回false,表明该处理方法并未完全处理该事件,该事件会传播出去。
对于基于回调的时间传播而言,某组件上所发生的事件不仅会激发该组件上的回调方法,也会触发该组件所在Activity的回调方法——只要事件能传播到该Activity。

二、实例

1、MyButton 子类

public class MyButton extends AppCompatButton {
    public MyButton(Context context , AttributeSet set)
    {
        super(context , set);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        super.onKeyDown(keyCode , event);
        Log.v("-MyButton-", "the onKeyDown in MyButton");
        // 返回false,表明并未完全处理该事件,该事件依然向外扩散
        return true;
    }
}

2、MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bn = (Button) findViewById(R.id.bn);
        Log.v("-Listener-", "the onKeyDown in Listener");
        // 为bn绑定事件监听器
        bn.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View source
                    , int keyCode, KeyEvent event) {
                // 只处理按下键的事件
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    Log.v("-Listener-", "the onKeyDown in Listener");
                }
                // 返回false,表明该事件会向外传播
                return false; 
            }
        });
    }
    // 重写onKeyDown方法,该方法可监听它所包含的所有组件的按键被按下事件
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        super.onKeyDown(keyCode , event);
        Log.v("-Activity-" , "the onKeyDown in Activity");
        //返回false,表明并未完全处理该事件,该事件依然向外扩散
        return true;
    }
}

这里是在模拟器里进行的测试,这里按下键盘(而不是点击),会看到 logcat 中的输出,如下:

V/-Listener-: the onKeyDown in Listener
V/-MyButton-: the onKeyDown in MyButton
V/-Activity-: the onKeyDown in Activity