4

我想要做的是拦截来自外部类的后退按钮按下,如下所示:

public class AnswerView extends RelativeLayout {

    public AnswerView(Context context) {
        super(context);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            Log.i("AlleAntwoorden", "Back button pressed!");
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

我正在从我的主要活动中添加它:

RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.main_layout);
mainLayout.addView(new AnswerView(this));
4

1 回答 1

7

为了让 View 接收任何事件,它需要获得焦点。我没有看到任何 XML,所以让我们在运行时添加几个特征:

AnswerView layout = new AnswerView(this);
layout.setFocusableInTouchMode(true);
layout.requestFocus();
mainLayout.addView(layout);

现在您的布局将拦截OnKeyListener. 但是如果另一个 View 有焦点,即使是子 View,该事件可能首先被子 View 消费。
要理解这一点,请将 EditText 添加到您的 AnswerView 中:

layout.addView(new EditText());

如果在 EditText 具有焦点时单击后退按钮:第一次单击关闭软键盘,第二次单击将正常完成当前 Activity。默认情况下,该OnKeyListener事件不会通过 View 层次结构向上传递。

于 2012-09-13T16:41:43.830 回答