一、重写onkeydown方法
- package wyf.ytl;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.KeyEvent;
- import android.widget.Button;
- public class Sample_7_1 extends Activity {
- public final String TAG = "Sample_7_1";
- MyButton myButton;
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- myButton = new MyButton(this);
- myButton.setText("全屏按钮");
- myButton.setTextSize(30);
- setContentView(myButton);
- }
- public boolean onKeyDown(int keyCode, KeyEvent event)
- { //重写的键盘按下监听
- Log.d(TAG, "activity onKeyDown");
- return super.onKeyDown(keyCode, event);
- }
- class MyButton extends Button
- {
- public MyButton(Context context)
- {
- super(context);
- }
- public boolean onKeyDown(int keyCode, KeyEvent event)
- {//重写的键盘按下监听
- Log.d(TAG, "MyView onKeyDown");
- //打印日志
- return true; //return false;
- }
- }
- }
onKeyDown方法,该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法,该方法用来捕捉手机键盘被按下的事件。
参数keyCode,该参数为被按下的键值即键盘码,手机键盘中每个按钮都会有其单独的键盘码,在应用程序都是通过键盘码才知道用户按下的是哪个键。
参数event,该参数为按键事件的对象,其中包含了触发事件的详细信息,例如事件的状态、事件的类型、事件发生的时间等。当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使用。
返回值,该方法的返回值为一个boolean类型的变量,当返回true时,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理,而当返回false时,表示并没有完全处理完该事件,更希望其他回调方法继续对其进行处理,例如Activity中的回调方法。
二、android回退键不触发onkeydown事件
点击模拟器上都回退键就直接退出了。Log也没有打印。
public class MainActivity extends ActivityGroup implements OnGestureListener, OnTouchListener { 。。。。。。。。。。。。。。。 /** * 回退键 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Log.i("main","onkeydown"); if(keyCode==KeyEvent.KEYCODE_BACK){ new AlertDialog.Builder(MainActivity.this).setTitle("音乐盒") .setIcon(R.drawable.icon_1) .setMessage("你确定要离开吗?") .setPositiveButton("确定",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //发送广播给services,使其停止播放。 finish(); } }).setNegativeButton("取消",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); } return super.onKeyDown(keyCode, event); } }
解决啦。于不是继承都activity有关。extends ActivityGroup 。所以onKeyDown不会执行。
public boolean dispatchKeyEvent(KeyEvent event) { System.out.println(KeyEvent.KEYCODE_BACK+"--------------------"+event.getKeyCode()+"---------------------"+event.getAction()); long exitTime = 0; if(event.getKeyCode()==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){ if((System.currentTimeMillis()-exitTime) > 2000){ Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); System.exit(0); } return true; } return super.dispatchKeyEvent(event); }
三、Android系统onKeyDown监控/拦截/监听/屏蔽返回键、菜单键和Home键
protected void dialog() {
AlertDialog.Builder builder = new Builder(TestActivity.this);
builder.setMessage("确定要退出吗?");
builder.setTitle("提示");
builder.setPositiveButton("确认",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
TestActivity.this.finish();
}
});
builder.setNegativeButton("取消",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) { //监控/拦截/屏蔽返回键
dialog();
return false;
} else if(keyCode == KeyEvent.KEYCODE_MENU) {
// rl.setVisibility(View.VISIBLE);
Toast.makeText(TestActivity.this, "Menu", Toast.LENGTH_SHORT).show();
return false;
} else if(keyCode == KeyEvent.KEYCODE_HOME) {
//由于Home键为系统键,此处不能捕获,需要重写onAttachedToWindow()
Toast.makeText(TestActivity.this, "Home", Toast.LENGTH_SHORT).show();
return false;
}
return super.onKeyDown(keyCode, event);
}
// 拦截/屏蔽系统Home键
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}