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:如何添加一个页面,如何跳