2016-11-19 14:11:22 mulanlong 阅读数 1663

android的按键事件是可以拦截,并自己处理的;

一般重写onkeydwon事件就行了;

@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		switch (keyCode) {
		case KeyEvent.KEYCODE_VOLUME_UP:// 增大音量
//			audioManagerM.adjustStreamVolume(AudioManager.STREAM_MUSIC,
//					AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND
//							| AudioManager.FLAG_SHOW_UI);
			audioManagerC.adjustStreamVolume(AudioManager.STREAM_VOICE_CALL,
					AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND
					| AudioManager.FLAG_SHOW_UI);
			
			break;
		case KeyEvent.KEYCODE_VOLUME_DOWN:// 减小音量
//			audioManagerM.adjustStreamVolume(AudioManager.STREAM_MUSIC,
//					AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND
//							| AudioManager.FLAG_SHOW_UI);
			audioManagerC.adjustStreamVolume(AudioManager.STREAM_VOICE_CALL,
					AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND
					| AudioManager.FLAG_SHOW_UI);
			
			break;
		case KeyEvent.KEYCODE_BACK:// 再按一次退出
			
			// 判断是否点了一次后退
			if (isPressedBackOnce) {
				// 已经点了一次,这是第二次
				// 判断一下跟上一次点击的时间间隔,如果大于2秒,再谈一次吐司,小于2秒 直接finish
				secondTime = System.currentTimeMillis();
				if (secondTime - firstTime > 2000) {
					// 第一次点击
					ToastUtil.showToast(this, "再点一次退出");
					isPressedBackOnce = true;
					firstTime = System.currentTimeMillis();
				} else {
					if (!BaseApplication.getInstance().getParam(Params.IS_INDIVIDUAL_CALLING, false)) {
						// 在2秒之内点击第二次
						finish();
						
						// finish完成之后当前进程依然在
						isPressedBackOnce = false;
						firstTime = 0;
						secondTime = 0;
					}
				}
			} else {
				// 第一次点击
				ToastUtil.showToast(this, "再点一次退出");
				isPressedBackOnce = true;
				firstTime = System.currentTimeMillis();
			}
			
			break;
		case KeyEvent.KEYCODE_HEADSETHOOK:
			
			break;
		default:
			return super.onKeyDown(keyCode, event);
		}
		// 为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件
		return true;
	}


比如上面的音量上下键关联媒体声音,或者打电话的声音;返回键再按一次退出的写法;当插入耳机时,还有按下接听键等等;


但如果现在的需求是,按手机侧面的上下键,而做其他的事情,不让其进行音量调节,要怎样做呢?

这就需要用到这个方法了:dispatchKeyEvent();从名字就可看出,是来对按键进行事件分发的;只要让他分发上下键时返回true,自己消费掉,就不会去调节音量了;

@Override
	public boolean dispatchKeyEvent(KeyEvent event) {
		switch (event.getKeyCode()) {
		case KeyEvent.KEYCODE_VOLUME_UP:// 增大音量
			
		      switch (event.getAction()) {
		      case KeyEvent.ACTION_DOWN://获取到按音量上键的down事件

		 	
			break;
		      case KeyEvent.ACTION_UP://获取到按音量上键的up事件

			downTimes = 0;
			
			break;
		return true;
			
		case KeyEvent.KEYCODE_VOLUME_DOWN:// 减小音量
			
				
		return true;
			
			
		}
		return super.dispatchKeyEvent(event);//其他按键可以直接分发出去,按原来逻辑处理就行。
	}

可以看到不仅可以拦截音量上下键事件;而且可以拿到物理按键的down、up等事件;进一步做具体的事情;

音量上下键可以如上来做,但电源键是不能拦截的。




2015-09-15 22:25:10 s695540301 阅读数 744

      onKeyDown()事件是监听系统的回退键的系统函数。建议对于每个activity事件都进行一次函数的重写以防止app的后退混乱,也同时保证了层次树的可控。

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
// TODO Auto-generated method stub
if(keyCode==KeyEvent.KEYCODE_BACK&& event.getRepeatCount() == 0)
{
//回退到系统桌面
Intent home = new Intent(Intent.ACTION_MAIN);
home.addCategory(Intent.CATEGORY_HOME);
startActivity(home);

}
return super.onKeyDown(keyCode, event);
}


2015-11-14 19:33:47 Smallsun_229 阅读数 864


   onkeydown 事件会在用户按下一个键盘按键时发生。这个不用说都知道,可以通过键值检测一下用户按下的是什么键,当然,onkeydown不仅仅是只有这个功能。

    总结一下onkeydown事件在实例中的应用,有两个小例子

     1.显示密码强度

      例如:在一个需要输入密码的input输入框内输入密码,输入的同时需要检测密码强度,并显示出来,如图。

     

      先说一个不怎么好但是也可以的方法,可以使用鼠标失焦事件onblur,即当鼠标离开密码输入框时,密码强度会显示出来。

      newPassword.onblur = function(){

          //判断密码框输入值的密码强度

         if(this.value.length>10){

                //两个块显示为红色

           }

       }

       显然,一般检测密码强度不是这样的,这时候,使用onkeydown事件试一下。随着input输入框值的改变,密码强度会随之改变。把上面那个函数onblur改成onkeydown就可以了。

  

     2.限制字数


     例如:一个留言板的回复,设置回复内容最多只能输入100字。回复框textarea

          如果此时设置<textarea  maxlength="100" ></textarea>是远远不够的,因为这时候用户在输入的时候,输入到100字后突然输入什么都输入不了,此时应该有一个提示,弹出一个提示框,好,那么就应该在用户一边输入的时候一边检测输入框的字数,如果字数到了100,就该提示用户不可以输入了。

    text.onkeydown = function(){
                  if(text.value.length==100){
                    alert("最多输入100个字~");
                 }
                 
                }

   代码写出来很少看起来十分的简单,重点是要知道在什么时候应该用onkeydown。

   **同时提一些输入框的常用的注意点:1.textarea框静止拉动拖动改变大小  resize:none;

                                                                2.input ,textarea输入框输入时文字离框要有一定的距离,padding-left:5px;

                                                                3.input,textarea输入框去掉默认蓝色框 outline:none;

                                                                4.div设置border时不要设置纯黑色,推荐一个,box-shadow,给div加一个阴影。box-shadow:2px  2px 5px #999;

                       


2015-11-24 17:31:43 u013289262 阅读数 879

android中继承view的类中onKeyDown(int keyCode, KeyEvent event)事件没反应,这是为什么?

原因很简单,view中没有确保能够获取焦点,所以onkeydown事件只能传到activity中,不能进一步传到view中

解决办法:

在该view中设置:

setFocusableInTouchMode(true); //确保能接收到触屏事件

setFocusable(true); 确保我们的View能获得输入焦点

关于OnKeyDown的记录

阅读数 802

onkeydown事件

阅读数 415

没有更多推荐了,返回首页