andorid中基于回调事件传播返回true与false的区别

事件处理分为基于监听机制和基于回调的事件传播,监听事件大部分没有返回值,基于回调的事件传播j几乎都有boolean类型返回值

该返回值用于标识该处理方法能否完全处理该事件。

1: 如果事件处理的回调方法返回true,表明该处理方法已完全处理该事件,该事件不会传播出去。

2:如果事件处理的回调方法返回false,表明该处理方法并未完全处理该事件,该事件会传播出去的。

对于基于回调的事件传播而言,某组件上所发生的事情不仅激发该组件的回调方法,也会触发该组件所在activity的回调

方法——只要事件能传播到该activity.


下面以实例来分析:

首先自定义Button,并且在MyButton中重写了onKeyDown()回调方法,return false

public class MyButton extends Button {
    public MyButton(Context context) {
        super(context);
    }
    public MyButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override

    //返回false,表明并未完全处理该事件,该事件依然向外扩散

    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        if(event.getAction()==MotionEvent.ACTION_DOWN){
            Log.i("msg","touch is in myButton");
        }
        return false;
    }
}


Activity的代码如下:

在该activity中为该button绑定事件监听器,并且重写了onKeyDown()

public class BackActivity1Activity extends Activity {
     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button button1=(Button) findViewById(R.id.mybutton);
            button1.setOnTouchListener(new OnTouchListener() {

                @Override

            //返回false,表明该事件向外传播

                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction()==MotionEvent.ACTION_DOWN){
                        Log.i("msg","touch is in listenner");
                    }
                    return false;
                }
            });
        }

        @Override

        //返回false,表明并未完全处理该事件,该事件依然向外扩散

        public boolean onTouchEvent(MotionEvent event) {
             super.onTouchEvent(event);
             if(event.getAction()==MotionEvent.ACTION_DOWN){
                 Log.i("msg","touch is in activity");
             }
             return false;
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
        }
}


最后所得的结果是:


由此不难看出,当该组件上发生某个按键被按下的事件时,Android系统最先触发的应该是该按键上绑定的事件监听器

接着才触发该组件提供的事件回调方法,然后还会传播到该组件所有的Activity,但如果我们让任何一个事件处理方法返回true

那么该事件将不会继续向外传播。

如果我们将事件监听器中的return false,改为return true.那么执行结果如下:

如果将MyButton中设置为return true,结果是:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以使用WebViewJavaScript与AndroidJava方法互调。 想要实现这个功能,需要使用到Android的WebView的addJavascriptInterface方法。这个方法可以将Java对象暴露给JavaScript代码,JavaScript代码就可以调用这个对象的方法,实现Java与JavaScript的互通。 具体步骤如下: 1. 在Java代码创建一个类,这个类包含需要暴露给JavaScript的方法。 2. 使用WebView的addJavascriptInterface方法将这个Java类对象暴露给JavaScript。 3. 在JavaScript代码,使用window对象来访问这个Java对象,即可调用其的方法。 具体的实现可以参考下面的代码示例: Java代码: ```java public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } ``` 在Activity使用addJavascriptInterface方法将Java对象暴露给JavaScript: ```java WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android"); ``` JavaScript代码通过window对象访问Java对象: ```javascript function showToast() { Android.showToast("Hello World!"); } ``` 注意,addJavascriptInterface方法需要在主线程调用,否则可能会出现安全问题。另外,在使用JavaScript调用Java方法时,需要添加@JavascriptInterface注解,以确保安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值