Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity
一、在xml 中設(shè)置按鍵的onClick 綁定的函數(shù)
新建一個(gè)工程
?然后在相關(guān)的頁面添加一個(gè)Button
?運(yùn)行一下
實(shí)際上,現(xiàn)在這個(gè)按鍵一,我們?nèi)ミ\(yùn)行的時(shí)候,他是沒有任何的反饋的,我們按完它,他沒有任何的反饋,那我如何才能讓他出現(xiàn)一些反饋呢?
我們用?????????android:onClick="buttonBeCliecked"
? ? ? ? ? ? ? ? 我們?cè)O(shè)置了這個(gè)函數(shù),這個(gè)函數(shù)是java 寫的 ,當(dāng)按鍵被按下的時(shí)候,就會(huì)調(diào)用java里面的??buttonBeCliecked? 這個(gè)函數(shù),那么調(diào)用哪個(gè)java文件呢?? ? ? ? MainActivity.java
? ? ? ? 因?yàn)镸ainActivity.java 在?setContentView這面去跟??activity_main 產(chǎn)生關(guān)聯(lián)
????????也就是說.xml文件綁定的所有函數(shù)都在.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;
? ? }
? ? 就先刪掉
?你要找的話,你要去實(shí)現(xiàn)? buttonBeCliecked? ?這個(gè)函數(shù)
? ? ? ? 這個(gè)函數(shù)需要一個(gè)權(quán)限? ? ? ? public? ? ? ? ?
,public的目的是擴(kuò)大這個(gè)函數(shù)???????buttonBeCliecked? ? 的可見度?
????????????????????????????????????? 我們涉及到函數(shù)的分裝,權(quán)限這一塊
然后他需要一個(gè)參數(shù)View? v,這就是它整個(gè)參數(shù)的原型
?view? V不認(rèn)識(shí),按下ctrl? ?+shirt? +? o
?這樣我們就可以當(dāng)用戶按下這個(gè)按鍵的時(shí)候,去調(diào)這個(gè)函數(shù)?public void buttonBeCliecked(View v)
????????但這個(gè)函數(shù)我們什么都沒做
? ? ? ? 那我們給他加一句????????System.out.println("button1 clicked");
?運(yùn)行一下
?我們按一下button1,他會(huì)顯示????????button1 clicked? ,但是我們?cè)谀睦锟茨?#xff1f;
看這個(gè)log Cat,logCat 這邊會(huì)顯示非常多的安卓模擬器的信息
?如果消息過多的話,我不想看,就可做一個(gè)過濾,
,沒看到任何的過濾,說明這個(gè)過濾器有時(shí)候沒那么好用
?這面還可以選擇,你是要看整個(gè)操作系統(tǒng)的,還是這個(gè)包里面的
?那比如我們現(xiàn)在又有一個(gè)按鍵,(拖個(gè)按鍵進(jìn)來)
?改一下名字
?我的按鍵二也可以指定一個(gè)onClick事件,當(dāng)按鍵二被按下的時(shí)候,我也可以同樣調(diào)用???
???????public void buttonBeCliecked(View v)? ? ? ? 這個(gè)函數(shù)
?運(yùn)行一下
無論我按,按鍵一,還是按鍵二 ,他都顯示? ? ? button1 clicked
?那我如何區(qū)分是? ? 一? ? ?還是? ? ?二? ? 被按下呢?
我們用? ? ?System.out.println(v.getId());? ?看看兩個(gè)按鍵的id
?這樣通過id 就能區(qū)分,既然通過id 就能區(qū)分,我們能不能定義一個(gè)id ,或者直接switch
運(yùn)行一下
發(fā)現(xiàn)id反了,我們給他修改一下
然后這個(gè)時(shí)候我們?cè)侔裷.java 刪掉,在讓他重新自動(dòng)生成
(我們說gen? 自動(dòng)生成幫你維護(hù)這個(gè)權(quán)限的)
?運(yùn)行一下
?我們?cè)趌ogcat 下面觀察? ? ? "按鍵一被按下"? ? “按鍵二被按下”? ? 是不是有點(diǎn)土呀
介紹一個(gè)類????????Toast.makeText(context, text, duration)? ?
???????????????????????? ? 這是一個(gè)構(gòu)造方法,最后會(huì)產(chǎn)生一個(gè)對(duì)象
? ??
context:????????上下文的意思? ?
,寫個(gè)this 就行 ,因?yàn)檫@面就一個(gè)類MainActivity ,這個(gè)this 指向MainActivity
? ? ? ? ??
text:????????需要顯示的內(nèi)容
,比如??????????"按鍵一被按下"
? ? ? ? ??
duration:? ? ? ? 顯示的時(shí)長
,默認(rèn)時(shí)長就可以了
? ? ? ?
? ??
Toast.makeText(this, "按鍵一被按下", 0);
? ??
?然后.show()? ? ? ? ?去顯示
?? ?Toast.makeText(this, "按鍵一被按下", 0).show();
運(yùn)行一下
整體的畫面?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
補(bǔ)充:?
有時(shí)候把函數(shù)名寫錯(cuò)了? ? ? ? 第17行加個(gè)s
然后我們運(yùn)行一下,程序崩潰了
?然后legcat有一個(gè)錯(cuò)誤提示,一大堆紅色的
?我們看到第三行就可以了,這面有一個(gè)?Could not find a method buttonBeCliecked(View) in the activity class?
你按鍵被按下的時(shí)候.xml會(huì)去找,找哪個(gè)函數(shù)?? ? ? ? 找 buttonBeCliecked
他說? ? ???Could not find a method buttonBeCliecked? ?因?yàn)槲野衙謱戝e(cuò)了
????????那 如果我們看不到? ? ? logCat? ? 怎么辦呢?
找到這里
?然后找到? Android??
?找到logCat,就可以了
?然后我們?cè)囍? ? public? 刪掉
運(yùn)行一下 ,發(fā)現(xiàn)程序還是崩潰
那如果我們的void 改成int 呢?? ? ? ? 第17行
然后加上第31行
運(yùn)行一下,這樣是可以的
但是,建議還是public? void? 加上函數(shù)名
View v也得加,必須加
? ? ? ? ?????????????????????????????????????????????????
????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? 二、按鍵相應(yīng)第二種方式,接口類
????????????????????????????????????????????????????????????????????????
關(guān)于監(jiān)聽器:監(jiān)聽器是一個(gè)存在于View類下的接口,一般以O(shè)n******Llistener命名,實(shí)現(xiàn)該接口需要復(fù)寫相應(yīng)的on****(View v)方法(如onClick(View v))。
Android提供的基于事件監(jiān)聽接口有
OnClickListener、OnLongClickListener、OnFocusChangeListener、OnKeyListener、OnTouchListener、OnCreateContextMenuListener等。
? ? ??
1)OnClickListener接口:該接口處理的是點(diǎn)擊事件。在觸摸模式下,是在某個(gè)View上按下并抬起的組合動(dòng)作,而在鍵盤模式下,是某個(gè)View獲得焦點(diǎn)后點(diǎn)擊確定鍵或者按下軌跡球事件。
2)OnLongClickListener接口: OnLongClickListener接口與上述的OnClickListener接口原理基本相同,只是該接口為View長按事件的捕捉接口,即當(dāng)長時(shí)間按下某個(gè)View時(shí)觸發(fā)的事件。
3)OnFocusChangeListener接口:OnFocusChangeListener接口用來處理控件焦點(diǎn)發(fā)生改變的事件。如果注冊(cè)了該接口,當(dāng)某個(gè)控件失去焦點(diǎn)或者獲得焦點(diǎn)時(shí)都會(huì)觸發(fā)該接口中的回調(diào)方法。
4)OnKeyListener接口:是對(duì)手機(jī)鍵盤進(jìn)行監(jiān)聽的接口,通過對(duì)某個(gè)View注冊(cè)并監(jiān)聽,當(dāng)View獲得焦點(diǎn)并有鍵盤事件時(shí),便會(huì)觸發(fā)該接口中的回調(diào)方法。
5)OnTouchListener接口:是用來處理手機(jī)屏幕事件的監(jiān)聽接口,當(dāng)為View的范圍內(nèi)觸摸按下、抬起或滑動(dòng)等動(dòng)作時(shí)都會(huì)觸發(fā)該事件。
6)OnCreateContextMenuListener接口:是用來處理上下文菜單顯示事件的監(jiān)聽接口。該方法是定義和注冊(cè)上下文菜單的另一種方式
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
我們復(fù)制一下,然后新建一個(gè)工程
?然后我們?cè)趕rc 下面的MainActivity.java
?做一個(gè)類? ? ? ? ? class MyclieckHandler implements View.OnClickListener
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 然后去? ? ?implements? ?這個(gè)接口
接口的話,就要實(shí)現(xiàn)里面的抽象方法
那這個(gè)方法怎么做?argo? 我們改成v,這個(gè)形參的名字隨便你
onClick的做法就是
?它處理的業(yè)務(wù)都是一樣的,只是走的流程不一樣
你寫在這里的話,發(fā)現(xiàn)makeText不管用,因?yàn)樗且粋€(gè)????????OnClickListener
因?yàn)閙akeText? 必須和????????MainActivity? 產(chǎn)生一些關(guān)系????????
那先給他注釋掉
?那我們?nèi)绾斡肕yclieckHandler 呢??
現(xiàn)在給一個(gè)button btn1();
?他不認(rèn)識(shí),然后ctrl? +shirt? +o?
?點(diǎn)開第三行
?然后我們加上
?????????btn1.setOnClickListener(new MyclieckHandler());
?然后我們?cè)?xml 里面需要去掉
?android:onClick="buttonBeCliecked"
? android:onClick="buttonBeCliecked"
這兩句話,因?yàn)檫@是第一種方法的
?在.java里面? ? ? ? 有些代碼可以刪掉的
?現(xiàn)在的代碼? ?.java 下面的
?
?.xml下面的
?
?我們運(yùn)行一下,發(fā)現(xiàn)程序直接崩了
?發(fā)現(xiàn)是空指針異常,這個(gè)btn1? 和 btn2? 你可以理解為c語言的野指針
你真的想用btn1 之前 你需要new 的????????
? ? ? ? ? ? ? ? ? ?btn1 = new Button();
? ? ? ? ?????????? ?btn2 = new Button();
?理論上需要這樣搞的
?但是你new 出來的Button和我這個(gè)頁面上的Button 是同一個(gè)東西嘛?
?那么如何將.java里面的Button 和 .xml 里
通過Id找組件? ? ?,讓.xml和我局部變量Button 產(chǎn)生聯(lián)系
? ? ? ? ????btn1 = (Button)findViewById(R.id.button1);
? ? ? ? ?? ?btn2 = (Button)findViewById(R.id.button2);
?運(yùn)行一下,可以了 ,沒有崩潰
我們自定義 的類實(shí)現(xiàn)了接口????????OnClickListener
同時(shí)有一個(gè)????????setOnClickListener? 這個(gè)函數(shù)為按鍵????????btn1? ? 添加點(diǎn)擊事件
不要忘記了? 你局部的Button 和 .xml 里面的button產(chǎn)生聯(lián)系
總結(jié):
2、自定義類實(shí)現(xiàn)按鍵監(jiān)聽事件的接口
? ? ? ? ? ? 2.1綁定? 局部變量 button 和xml 中的button ,? findViewByld
? ? ? ? ? ?2.2 實(shí)現(xiàn)接口類,在類中實(shí)現(xiàn)onclicked 方法,寫業(yè)務(wù)代碼
? ? ? ? ? ?2.3 為1,2兩部做的準(zhǔn)備進(jìn)行綁定。使得按鍵被按下后執(zhí)行你寫的業(yè)務(wù)代碼? ?
? ? 局部變量:
????????Button btn1;
?? ?Button btn2;
? ? ??
綁定.xml? ? :? ??
? ? ? ? ?? ?btn1 = (Button) findViewById(R.id.button1);
? ? ? ? ?? ?btn2 = (Button) findViewById(R.id.button2);
設(shè)置監(jiān)聽器:
????????btn1.setOnClickListener(new MyclieckHandler());
? ? ? ? ?? ?btn2.setOnClickListener(new MyclieckHandler());
? ? ?
設(shè)置監(jiān)聽器之前你要自己實(shí)現(xiàn)一個(gè)類:
class MyclieckHandler implements View.OnClickListener
(這個(gè)類實(shí)現(xiàn)了OnClickListener這樣的一個(gè)接口)
三、按鍵響應(yīng)的第三種方式匿名內(nèi)部類
復(fù)制一下 上一個(gè)工程
?匿名內(nèi)部類如何實(shí)現(xiàn)呢?
首先里面兩個(gè)button 綁定,都要一樣
? ? ? ? ?? ?btn1 = (Button) findViewById(R.id.button1);
? ? ? ? ?? ?btn2 = (Button) findViewById(R.id.button2);
只不過
????????btn1.setOnClickListener(new MyclieckHandler());
? ? ? ? ?? ?btn2.setOnClickListener(new MyclieckHandler());????????
沒有自己的????????MyclieckHandler? ? ? ? ? 而是去直接new 一個(gè)????????View.OnClickListener
? ? ? ? 你? New一個(gè)接口的時(shí)候就會(huì)產(chǎn)生匿名內(nèi)部類了,你要為這個(gè)內(nèi)部類實(shí)現(xiàn)里面的抽象接口
? ? ? ? 這面就不要用switch? ? case? ? id? ? 了,因?yàn)? 是一一綁定的
? ? ? ? btn1? 綁定? ? ? ? ? ??OnClickListener()?
?????????? ?public void onClick(View arg0)? 這個(gè)View 就是but1 自己
????????btn1當(dāng)被按下的時(shí)候,就顯示????????System.out.println("按鍵一被按下");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 也可以顯示彈窗?????????Toast.makeText(this, "按鍵一被按下", 0).show()
? ? ? ? ????????因?yàn)門oast.makeText 在????????onCreate 下面
因?yàn)????????Toast.makeText(this, "按鍵一被按下", 0).show();? ? ? ? 在????????MainActivity下面
所以????????Toast.makeText(MainActivity.this, "按鍵一被按下", 0).show();
? ? ? ? ??
?
?同樣你想做btn2,完整的代碼
?顯得很麻煩,因?yàn)樗獮槊恳粋€(gè)按鍵做這些事
因?yàn)槭悄涿麅?nèi)部類,導(dǎo)致每一次用它的時(shí)候,都要現(xiàn)場建這個(gè)類,去實(shí)現(xiàn)里面的接口
??
四、按鍵響應(yīng)的第四種方式,Activity
通過Activty 為整個(gè)Activity 設(shè)置監(jiān)聽事件
copy上一個(gè)工程
這兩個(gè)東西是使用了 匿名內(nèi)部類的方式
?刪掉
?我要讓整個(gè)Activty去重寫
public class MainActivity extends Activity implements View.OnClickListener
?同樣的要去重寫里面的方法
?你的主控件????????MainActivity,繼承了???????Activity ,同時(shí)他去重寫了???? ?OnClickListener這個(gè)接口
? ? ? ? 對(duì)頁面來說,具備了檢測按鍵按下的功能
你頁面里面的主鍵要單獨(dú)設(shè)置,? ? 把你Activty 里面有的,對(duì)按鍵監(jiān)聽的功能設(shè)置給btn1
?????????????????????????????????btn1.setOnClickListener(this);
加上? ?
? ? ? ? ? ? ? ? ? ? ? ? btn2.setOnClickListener(this);
按鍵就含有了,按下被響應(yīng)的功能
同樣的public void onClick(View arg0)? ?改成??public void onClick(View v)??
?
剩下的東西,跟我們自定義類里面一摸一樣
記得把a(bǔ)rgo? 改成 v
現(xiàn)在的代碼
總結(jié)
以上是生活随笔為你收集整理的Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 放u盘里的文件打不开怎么办 U盘文件无法
- 下一篇: Android:如何添加一个页面,如何跳