.Net 轉戰 Android 4.4 日常筆記(8)--常見事件響應及實現方式

來源:互聯網
上載者:User

標籤:android   style   blog   class   c   code   

在Andrioid開發中,常見的事件如下
  1. 單擊事件 OnClickListener
  2. 長按事件 OnLongClickListener
  3. 滑動事件 OnTouchListenner
  4. 鍵盤事件 OnKeyListenner
  5. 焦時間點事件 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去擷取點擊了哪個鍵!實際上非常有趣...

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.