標籤:android style blog class c code
在Andrioid開發中,常見的事件如下
- 單擊事件 OnClickListener
- 長按事件 OnLongClickListener
- 滑動事件 OnTouchListenner
- 鍵盤事件 OnKeyListenner
- 焦時間點事件 setOnFoucsChangeListener
設定方式
1.動態設定(最常用的方式)
Button btn = (Button) findViewById(R.id.btnTest); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.i("Tip","按鈕被點擊了"); } });
2.配置方式(僅限於Button的OnClick事件)
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Test1" android:id="@+id/btnTest1" android:layout_below="@+id/btnTest" android:layout_centerHorizontal="true" android:layout_marginTop="56dp" android:onClick="Test1"/>
在拖入的控制項加入 android:onClick="Test1" ,後台必須有Test1方法對應,在Test1按Alt+Enter建立方法
public void Test1(View view) { //傳入的View是當前的button Button btn = (Button)view; btn.setText("改變了按鈕的文本"); Log.i("Tip","配置的按鈕被點擊了!"); }
3.可複用方式(這種方式適用於重複可複用代碼)
首先在我們的MainActivity加入方法
private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { Log.i("Tip","監聽到按鈕點擊!"); } };
拖入3個按鈕並設定ID分別為btnTest2,btnTest3,btnTest4
在onCreate方法中加入這3個按鈕的事件。
Button btn2 = (Button) findViewById(R.id.btnTest2); Button btn3 = (Button) findViewById(R.id.btnTest3); Button btn4 = (Button) findViewById(R.id.btnTest4); btn2.setOnClickListener(listener); btn3.setOnClickListener(listener); btn4.setOnClickListener(listener);
這樣我們用了更少的代碼獲得更清晰的結構
接下來我們要在方法中判斷是那個按鈕點擊了
private View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { //通過getId來擷取觸發的是那個按鈕 switch(view.getId()) { case R.id.btnTest2: Log.i("Tip","點擊按鈕2!"); break; case R.id.btnTest3: Log.i("Tip","點擊按鈕3!"); break; case R.id.btnTest4: Log.i("Tip","點擊按鈕4!"); break; } } };
查看結果
長按和點擊事件存在產生的問題
如果我們一個事件同時綁定了OnClick事件和OnLongClick事件,會發生什麼!
拖入一個button Id為btnTest5,並綁定2個事件
Button btn5 = (Button) findViewById(R.id.btnTest5); btn5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.i("Tip","按鈕被點擊了"); } }); btn5.setOnLongClickListener(new View.OnLongClickListener(){ @Override public boolean onLongClick(View view) { Log.i("Tip","按鈕被長按了了"); return false; } });
我們長按後鬆開按鈕看看列印出什麼(2個事件觸發了,但是我們貌似只要長按,在我們理解中,長按就是長按,單擊就是單擊)
這時我們看看協助文檔怎麼說
Returns
true if the callback consumed the long click, false otherwise.
大約理解到
onLongClick 返回 true時候會回調消耗這個事件不會往下傳遞,現在我們改下代碼
btn5.setOnLongClickListener(new View.OnLongClickListener(){ @Override public boolean onLongClick(View view) { Log.i("Tip","按鈕被長按了"); return true; } });
運行之後的點擊只顯示長按事件的觸發
觸摸事件
Touch事件由元事件組成action_up,action_down,action_move等等....
Button btn6 = (Button) findViewById(R.id.btnTest6); //Touch事件由元事件組成action_up,action_down,action_move等等.... btn6.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { int event = motionEvent.getAction(); if(event==MotionEvent.ACTION_DOWN) { Log.i("Tip","被按下..."); } else if(event==MotionEvent.ACTION_MOVE) { Log.i("Tip","被移動..."); } else if(event==MotionEvent.ACTION_UP) { Log.i("Tip","被鬆開..."); } return false; } });
可以看到滑鼠按後在上面移動後鬆開的事件觸發!
再來看一個有趣的動作,可以移動的按鈕,根據容器的event擷取 X和Y座標給按鈕
現在開啟MainActivity.xml的給容器一個ID值
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.ymnets.testtouchlistener.app.MainActivity" android:id="@+id/myLayout" >
改變一下代碼
ViewGroup viewGroup = (ViewGroup) findViewById(R.id.myLayout); final Button btn = (Button)findViewById(R.id.button); //Touch事件由元事件組成action_up,action_down,action_move等等.... viewGroup.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { int event = motionEvent.getAction(); if(event==MotionEvent.ACTION_MOVE) { btn.setX(motionEvent.getX()); btn.setY(motionEvent.getY()); Log.i("Tip","被移動..."); } return true; } });
其中ViewGroup其實就是布局,View就是組件元素
現在大力的移動手指吧!
焦時間點事件
焦時間點事件跟我們的JS的焦時間點事件基本一個性質。
但是Android得到焦點和失去焦點都在同個方法內運行
隨便拖一個TextBox在安卓裡面叫EditText
輸入事件代碼
EditText editText = (EditText) findViewById(R.id.editText); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean b) { Log.i("Tip","有焦點了..."); } });
當文字框得到和失去焦點時候都會出現日誌
05-20 05:03:52.009 1165-1165/com.ymnets.testtouchlistener.app I/Tip﹕ 有焦點了...
鍵盤事件
設定我們文字框的鍵盤事件!
editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { if(keyEvent.getAction()==KeyEvent.ACTION_UP) { Log.i("Tip", i + ""); } return false; } });
其中的i是keyCode,輸出了keyCode
當然我們也可以根據keyCode去擷取點擊了哪個鍵!實際上非常有趣...