我要做的是拦截来自外部类的back按钮按下,如下所示:
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));
最佳答案
为了让视图接收任何事件,它需要有焦点。我看不到任何XML,所以让我们在运行时添加一些特性:
AnswerView layout = new AnswerView(this);
layout.setFocusableInTouchMode(true);
layout.requestFocus();
mainLayout.addView(layout);
现在您的布局将截获
OnKeyListener
中的后退按钮。但是,如果另一个视图有焦点,甚至是子视图,则该事件可能首先由子视图消费。要理解这一点,请将EditText添加到您的答案视图中:
layout.addView(new EditText());
如果在EditText有焦点时单击后退按钮:第一次单击关闭软键盘,第二次单击将像正常一样完成当前活动。默认情况下,
OnKeyListener
事件不会通过视图层次结构向上传递。