Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity
一、在xml 中设置按键的onClick 绑定的函数
新建一个工程
然后在相关的页面添加一个Button
运行一下
实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任何的反馈,那我如何才能让他出现一些反馈呢?
我们用 android:onClick="buttonBeCliecked"
我们设置了这个函数,这个函数是java 写的 ,当按键被按下的时候,就会调用java里面的 buttonBeCliecked 这个函数,那么调用哪个java文件呢? MainActivity.java
因为MainActivity.java 在 setContentView这面去跟 activity_main 产生关联
也就是说.xml文件绑定的所有函数都在.java文件里面去找
这段没什么用
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
就先删掉
你要找的话,你要去实现 buttonBeCliecked 这个函数
这个函数需要一个权限 public
,public的目的是扩大这个函数 buttonBeCliecked 的可见度
我们涉及到函数的分装,权限这一块
然后他需要一个参数View v,这就是它整个参数的原型
view V不认识,按下ctrl +shirt + o
这样我们就可以当用户按下这个按键的时候,去调这个函数 public void buttonBeCliecked(View v)
但这个函数我们什么都没做
那我们给他加一句 System.out.println("button1 clicked");
运行一下
我们按一下button1,他会显示 button1 clicked ,但是我们在哪里看呢?
看这个log Cat,logCat 这边会显示非常多的安卓模拟器的信息
如果消息过多的话,我不想看,就可做一个过滤,
,没看到任何的过滤,说明这个过滤器有时候没那么好用
这面还可以选择,你是要看整个操作系统的,还是这个包里面的
那比如我们现在又有一个按键,(拖个按键进来)
改一下名字
我的按键二也可以指定一个onClick事件,当按键二被按下的时候,我也可以同样调用
public void buttonBeCliecked(View v) 这个函数
运行一下
无论我按,按键一,还是按键二 ,他都显示 button1 clicked
那我如何区分是 一 还是 二 被按下呢?
我们用 System.out.println(v.getId()); 看看两个按键的id
这样通过id 就能区分,既然通过id 就能区分,我们能不能定义一个id ,或者直接switch
运行一下
发现id反了,我们给他修改一下
然后这个时候我们再把r.java 删掉,在让他重新自动生成
(我们说gen 自动生成帮你维护这个权限的)
运行一下
我们在logcat 下面观察 "按键一被按下" “按键二被按下” 是不是有点土呀
介绍一个类 Toast.makeText(context, text, duration)
这是一个构造方法,最后会产生一个对象
context: 上下文的意思
,写个this 就行 ,因为这面就一个类MainActivity ,这个this 指向MainActivity
text: 需要显示的内容
,比如 "按键一被按下"
duration: 显示的时长
,默认时长就可以了
Toast.makeText(this, "按键一被按下", 0);
然后.show() 去显示
Toast.makeText(this, "按键一被按下", 0).show();
运行一下
整体的画面
补充:
有时候把函数名写错了 第17行加个s
然后我们运行一下,程序崩溃了
然后legcat有一个错误提示,一大堆红色的
我们看到第三行就可以了,这面有一个 Could not find a method buttonBeCliecked(View) in the activity class
你按键被按下的时候.xml会去找,找哪个函数? 找 buttonBeCliecked
他说 Could not find a method buttonBeCliecked 因为我把名字写错了
那 如果我们看不到 logCat 怎么办呢?
找到这里
然后找到 Android
找到logCat,就可以了
然后我们试着把 public 删掉
运行一下 ,发现程序还是崩溃
那如果我们的void 改成int 呢? 第17行
然后加上第31行
运行一下,这样是可以的
但是,建议还是public void 加上函数名
View v也得加,必须加
二、按键相应第二种方式,接口类
关于监听器:监听器是一个存在于View类下的接口,一般以On******Llistener命名,实现该接口需要复写相应的on****(View v)方法(如onClick(View v))。
Android提供的基于事件监听接口有
OnClickListener、OnLongClickListener、OnFocusChangeListener、OnKeyListener、OnTouchListener、OnCreateContextMenuListener等。
1)OnClickListener接口:该接口处理的是点击事件。在触摸模式下,是在某个View上按下并抬起的组合动作,而在键盘模式下,是某个View获得焦点后点击确定键或者按下轨迹球事件。
2)OnLongClickListener接口: OnLongClickListener接口与上述的OnClickListener接口原理基本相同,只是该接口为View长按事件的捕捉接口,即当长时间按下某个View时触发的事件。
3)OnFocusChangeListener接口:OnFocusChangeListener接口用来处理控件焦点发生改变的事件。如果注册了该接口,当某个控件失去焦点或者获得焦点时都会触发该接口中的回调方法。
4)OnKeyListener接口:是对手机键盘进行监听的接口,通过对某个View注册并监听,当View获得焦点并有键盘事件时,便会触发该接口中的回调方法。
5)OnTouchListener接口:是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。
6)OnCreateContextMenuListener接口:是用来处理上下文菜单显示事件的监听接口。该方法是定义和注册上下文菜单的另一种方式
我们复制一下,然后新建一个工程
然后我们在src 下面的MainActivity.java
做一个类 class MyclieckHandler implements View.OnClickListener
然后去 implements 这个接口
接口的话,就要实现里面的抽象方法
那这个方法怎么做?argo 我们改成v,这个形参的名字随便你
onClick的做法就是
它处理的业务都是一样的,只是走的流程不一样
你写在这里的话,发现makeText不管用,因为他是一个 OnClickListener
因为makeText 必须和 MainActivity 产生一些关系
那先给他注释掉
那我们如何用MyclieckHandler 呢?
现在给一个button btn1();
他不认识,然后ctrl +shirt +o
点开第三行
然后我们加上
btn1.setOnClickListener(new MyclieckHandler());
然后我们在.xml 里面需要去掉
android:onClick="buttonBeCliecked"
android:onClick="buttonBeCliecked"
这两句话,因为这是第一种方法的
在.java里面 有些代码可以删掉的
现在的代码 .java 下面的
.xml下面的
我们运行一下,发现程序直接崩了
发现是空指针异常,这个btn1 和 btn2 你可以理解为c语言的野指针
你真的想用btn1 之前 你需要new 的
btn1 = new Button();
btn2 = new Button();
理论上需要这样搞的
但是你new 出来的Button和我这个页面上的Button 是同一个东西嘛?
那么如何将.java里面的Button 和 .xml 里
通过Id找组件 ,让.xml和我局部变量Button 产生联系
btn1 = (Button)findViewById(R.id.button1);
btn2 = (Button)findViewById(R.id.button2);
运行一下,可以了 ,没有崩溃
我们自定义 的类实现了接口 OnClickListener
同时有一个 setOnClickListener 这个函数为按键 btn1 添加点击事件
不要忘记了 你局部的Button 和 .xml 里面的button产生联系
总结:
2、自定义类实现按键监听事件的接口
2.1绑定 局部变量 button 和xml 中的button , findViewByld
2.2 实现接口类,在类中实现onclicked 方法,写业务代码
2.3 为1,2两部做的准备进行绑定。使得按键被按下后执行你写的业务代码
局部变量:
Button btn1;
Button btn2;
绑定.xml :
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
设置监听器:
btn1.setOnClickListener(new MyclieckHandler());
btn2.setOnClickListener(new MyclieckHandler());
设置监听器之前你要自己实现一个类:
class MyclieckHandler implements View.OnClickListener
(这个类实现了OnClickListener这样的一个接口)
三、按键响应的第三种方式匿名内部类
复制一下 上一个工程
匿名内部类如何实现呢?
首先里面两个button 绑定,都要一样
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
只不过
btn1.setOnClickListener(new MyclieckHandler());
btn2.setOnClickListener(new MyclieckHandler());
没有自己的 MyclieckHandler 而是去直接new 一个 View.OnClickListener
你 New一个接口的时候就会产生匿名内部类了,你要为这个内部类实现里面的抽象接口
这面就不要用switch case id 了,因为 是一一绑定的
btn1 绑定 OnClickListener()
public void onClick(View arg0) 这个View 就是but1 自己
btn1当被按下的时候,就显示 System.out.println("按键一被按下");
也可以显示弹窗 Toast.makeText(this, "按键一被按下", 0).show()
因为Toast.makeText 在 onCreate 下面
因为 Toast.makeText(this, "按键一被按下", 0).show(); 在 MainActivity下面
所以 Toast.makeText(MainActivity.this, "按键一被按下", 0).show();
同样你想做btn2,完整的代码
显得很麻烦,因为他要为每一个按键做这些事
因为是匿名内部类,导致每一次用它的时候,都要现场建这个类,去实现里面的接口
四、按键响应的第四种方式,Activity
通过Activty 为整个Activity 设置监听事件
copy上一个工程
这两个东西是使用了 匿名内部类的方式
删掉
我要让整个Activty去重写
public class MainActivity extends Activity implements View.OnClickListener
同样的要去重写里面的方法
你的主控件 MainActivity,继承了 Activity ,同时他去重写了 OnClickListener这个接口
对页面来说,具备了检测按键按下的功能
你页面里面的主键要单独设置, 把你Activty 里面有的,对按键监听的功能设置给btn1
btn1.setOnClickListener(this);
加上
btn2.setOnClickListener(this);
按键就含有了,按下被响应的功能
同样的public void onClick(View arg0) 改成 public void onClick(View v)
剩下的东西,跟我们自定义类里面一摸一样
记得把argo 改成 v
现在的代码
总结
以上是生活随笔为你收集整理的Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 放u盘里的文件打不开怎么办 U盘文件无法
- 下一篇: Android:如何添加一个页面,如何跳