覆盖后,onKeyUp / onKeyDown在Anroid中不起作用吗?

时间:2019-10-13 13:31:56

标签: android android-touch-event

我试图重写这三种方法,以便在控制台上打印出日志,但是运行该程序后,我发现单击按钮后只有关于​​方法onTouchEvent()的日志。其他两种方法:onKeyDown()onKeyUp()似乎无效。我是Android的新手,非常感谢您的帮助。这是否意味着onKeyDown()onKeyUp()被错误覆盖? 以下是MyButton类:

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;


import androidx.appcompat.widget.AppCompatButton;

public class MyButton extends AppCompatButton {

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private static String TAG = "TAG_";

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        super.onKeyDown(keyCode, event);
        Log.i(TAG, "onKeyDown is been called");
        return true;
    }


    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        super.onKeyUp(keyCode, event);

        Log.i(TAG, "onKeyUp is been called");
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        Log.i(TAG, "onTouchEvent is been called");
        return true;

    }
}

这是activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.learncallback.MyButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"/>
</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

KeyEvent是从IME或物理键盘到视图的信号。如果要处理触摸事件,则应覆盖已经完成的onTouchEvent(MotionEvent)-以接收触摸信息。

我假设您想跟踪视图是否被触摸。为此,您需要解析传递给MotionEvent的{​​{1}},因为只要该视图上发生触摸事件(只要父级不使用{{3}来拦截),框架就会调用此方法。 })。

使用以下方法来触摸onTouchEvent中的事件:

onTouchEvent

请注意,只有从初始呼叫@Override public boolean onTouchEvent(MotionEvent e) { switch (e.getActionMasked()) { case MotionEvent.ACTION_DOWN: // View being pressed down on case MotionEvent.ACTION_MOVE: // View being pressed down on case MotionEvent.ACTION_UP: // View not touched anymore // ... } return true; } 返回MotionEvent.ACTION_DOWN时,您才会收到true以外的触摸事件。