Android监听事件学习笔记
很抱歉本文的图片没了,如果希望获取代码的和pdf(有图片)学习的可以下载附上的pdf链接:
1.在Android中,View只是提供一个视觉的交互界面,如果要让View响应用户的交互行为,就需要为View添加事件处理,如前面案例或实验中使用较多的View.OnClickListener事件侦听器,一般来说事件侦听器都是包含回调方法的抽象接口,例如OnClickListener对应的回调方法为OnClick()。实际上,除了OnClickListener事件外,Android中的事件侦听器还有(部分罗列):
侦听器 回调方法 描述
OnLongClickListener() OnLongClick() 对长点击事件进行监听
OnFocusChangeListener() OnFocusChange() 对聚焦事件进行监听
OnKeyListener() OnKey() 对按键输入进监听
OnTouchListener() OnTouch() 对某个控件的触摸检测
OnMenuItemClickListener() OnMenuItemClick() 选项菜单点击检测
OnCreateContextMenuListener() OnCreateContextMenu() 是用来处理上下文菜单显示事件的监听接口
请查阅相关资料或书籍,比较系统地学习一下Android中的事件处理,找出以上这些侦听器对应的使用场景,并补充其他相关的事件处理,如果可能的话请编程对其中的部分事件进行实际的验证。
我通过自己编写的一个案例来对上面六个Android事件监听器进行说明:
-
OnLongClickListener()
这是一个用于长点击事件监听的监听器,平时我们只是通过点击然后获得相应,但是如果想要获得长时间点击时候的响应就需要使用这个监听器,具体使用可以用在长点击弹出菜单:
-
代码:
//给这个按钮设置长按监听 longclickbutton = (Button) findViewById(R.id.button); longclickbutton.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //输出消息 Toast.makeText(MainActivity.this, "我是长按button", Toast.LENGTH_SHORT).show(); return true; } });
-
当长时间点击时就可以获得相应,这里输出一个弹出框。
-
-
OnFocusChangeListener()
这是用于焦点监听的监听器,比如输入框获得点击就会被监听到,这样当用户点击输入框时可以进行相对于的响应,比如显示输入不符合标准,就可以在输入时候给用户提示:
-
代码:
//聚焦 foucus1 = (EditText) findViewById(R.id.editText); foucus1.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus==true){ foucus1.setHint("现在聚焦于此"); }else{ foucus1.setHint("现在聚焦于他处"); } } }); foucus2 = (EditText) findViewById(R.id.editText2); foucus2.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus==true){ foucus2.setHint("现在聚焦于此"); }else{ foucus2.setHint("现在聚焦于他处"); } } });
-
这里用来两个输入框,当其中一个获取焦点显示“现在聚焦于此”,另外一个就无法获取焦点输出:“现在聚焦于他处”:
-
-
OnKeyListener()
这是一个用于获得键盘监听事件的监听器,当用户键盘输入时候就会立刻获得相应,这里用一个计算BMI的例子来举例,我对体重进行监听,当体重输入时就会显示出当前计算的BMI的值:
- 代码:
//按键监听 key1 = (EditText) findViewById(R.id.editText4); key2 = (EditText) findViewById(R.id.editText5); textview = (TextView) findViewById(R.id.textView2); key2.setOnKeyListener(new EditText.OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { double x = Double.valueOf(key1.getText().toString()); double y = Double.valueOf(key2.getText().toString()); double z; try{ z= y/x; }catch (ArithmeticException exc){ Log.d(MainActivity.ACTIVITY_TAG,"计算错误"); } textview.setText("BMI:"+y/x); return false; } });
- 显示效果:
-
OnTouchListener()
触摸检测用于检测一些按下,松开,拖动等事件,使用也比较广泛,这里用一个按下松开事件进行说明:
- 代码:
//触摸监听 TouchButton = (Button) findViewById(R.id.button4); TouchButton.setOnTouchListener(new View.OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: TouchButton.setText("按下"); break; case MotionEvent.ACTION_UP: TouchButton.setText("松开"); break; } return true; } });
-
显示结果,当按下按钮显示按下,当松开按钮显示松开:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dWP1fMiQ-1585498335655)(D:\桌面\image-20200329234132502.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b4bWg4OS-1585498335659)(D:\桌面\image-20200329234132502.png)]
-
OnMenuItemClickListener()
选项菜单监听器,也就是在右上角的菜单,可以对选项进行监听:
-
代码:
//选项菜单点击监听 @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); getMenuInflater().inflate(R.menu.main_menu,menu); menu.findItem(R.id.menu_login).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this, "登录按钮按下", Toast.LENGTH_SHORT).show(); return true; } }); menu.findItem(R.id.menu_setting).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this, "设置按钮按下", Toast.LENGTH_SHORT).show(); return true; } }); menu.findItem(R.id.menu_exit).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this, "退出按钮按下", Toast.LENGTH_SHORT).show(); return true; } }); return true; }
显示效果:
点击登录:
-
-
OnCreateContextMenuListener()
是用来处理上下文菜单显示事件的监听接口:
-
代码:
//长按显示上下文菜单按钮 ContextMenuButton = (Button) findViewById(R.id.button2); ContextMenuButton.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { registerForContextMenu(v); openContextMenu(v); return true; } });
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); getMenuInflater().inflate(R.menu.main_menu,menu); menu.findItem(R.id.menu_login).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this, "登录按钮按下", Toast.LENGTH_SHORT).show(); return true; } }); menu.findItem(R.id.menu_setting).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this, "设置按钮按下", Toast.LENGTH_SHORT).show(); return true; } }); menu.findItem(R.id.menu_exit).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(MainActivity.this, "退出按钮按下", Toast.LENGTH_SHORT).show(); return true; } }); }
-
显示结果
-
除了这些监听器之外还有很多其他的监听器,安坐这些监听器,有了这些监听器才可以让安卓更加方便使用。
<img src="D:\桌面\image-20200329234753038.png" alt="image-20200329234753038" style="zoom:50%;"/>
除了这些监听器之外还有很多其他的监听器,安坐这些监听器,有了这些监听器才可以让安卓更加方便使用。