小豬的Android入門之路 Day 4,androidday

來源:互聯網
上載者:User

小豬的Android入門之路 Day 4,androidday

小豬的Android入門之路 Day 4 - part 1

Android事件處理機制之——基於監聽的事件處理機制



本節引言:

在開始本個章節前,我們先回顧下,現在我們已經知道了android的一些相關背景,一些常用的UI組件,

六大布局,現在的我們已經可以做出一個簡單的app介面了,下一步就是邏輯與業務的實現了;在前面

的例子中我們曾經看到過setXXXListener這些東東,這個就是android 的事件處理,而這個方法是基於監聽的

Android為我們提供了兩套功能強大的事件處理機制:

①基於監聽的事件處理機制

②基於回調的事件處理機制

我們將會分成幾個部分來講解Android的事件處理機制,而在這一part中我們會詳細地解析

基於監聽的事件處理機制!



本節學習路線圖:




本文:



基於監聽的時間處理機制模型:


流程模型圖:




文字表述:

事件監聽機制中由事件來源,事件,事件監聽器三類對象組成

處理流程:

step 1:為某個事件來源(組件)設定一個監聽器,用於監聽使用者操作

step 2:使用者的操作,觸發了事件來源的監聽器

step 3:產生了對應的事件對象

step 4:將這個事件來源對象作為參數傳給事件監聽器

step 5:事件監聽器對事件對象進行判斷,執行對應的事件處理器(對應事件的處理方法)



歸納:

事件監聽機制是一種委派式的事件處理機制,事件來源(組件)事件處理委託給事件監聽器

當事件來源發生指定事件時,就通知指定事件監聽器,執行相應的操作






監聽機制的使用形式:


這裡示範的是一個簡單的按鈕點擊,提示Toast資訊的程式

但是使用不同的形式來實現:


:





不同實現:



①直接用匿名內部類


平時最常用的一種:直接setXxxListener後,重寫裡面的方法即可;

通常是臨時使用一次,複用性不高!


代碼:

MainActivity.java

package com.jay.example.innerlisten;    import android.os.Bundle;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.Toast;  import android.app.Activity;      public class MainActivity extends Activity {        private Button btnshow;            @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);                    btnshow = (Button) findViewById(R.id.btnshow);          btnshow.setOnClickListener(new OnClickListener() {              //重寫點擊事件的處理方法onClick()              @Override              public void onClick(View v) {                  //顯示Toast資訊                  Toast.makeText(getApplicationContext(), "你點擊了按鈕", Toast.LENGTH_SHORT).show();              }          });      }      }  


                                                                                                                                                                           





②使用內部類


和上面的匿名內部類不同哦!

使用優點:可以在該類中進行複用,可直接存取外部類的所有介面組件!


代碼:

MainActivity.java

package com.jay.example.innerlisten;    import android.os.Bundle;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.Toast;  import android.app.Activity;      public class MainActivity extends Activity {        private Button btnshow;            @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);                    btnshow = (Button) findViewById(R.id.btnshow);          //直接new一個內部類對象作為參數          btnshow.setOnClickListener(new BtnClickListener());                }                   //定義一個內部類,實現View.OnClickListener介面,並重寫onClick()方法      class BtnClickListener implements View.OnClickListener      {          @Override          public void onClick(View v) {                            Toast.makeText(getApplicationContext(), "按鈕被點擊了", Toast.LENGTH_SHORT).show();          }                }  }


                                                                                                                                                                           



③使用外部類

就是另外建立一個處理事件的Java檔案,這種形式用的比較少!

因為外部類不能直接存取使用者介面類中的組件,要通過構造方法將組件傳入使用;

這樣導致的結果就是代碼不夠簡潔!


ps:為了示範傳參,這裡用TextView代替Toast提示!





代碼:

MyClick.java

package com.jay.example.innerlisten;    import android.view.View;  import android.view.View.OnClickListener;  import android.widget.TextView;    public class MyClick implements OnClickListener {        private TextView textshow;      //把文字框作為參數傳入      public MyClick(TextView txt)      {          textshow = txt;      }            @Override      public void onClick(View v) {          //點擊後設定文字框顯示的文字          textshow.setText("點擊了按鈕!");      }    }  


MainActivity.java

package com.jay.example.innerlisten;  import android.os.Bundle;  import android.widget.Button;  import android.widget.TextView;  import android.app.Activity;      public class MainActivity extends Activity {        private Button btnshow;      private TextView txtshow;            @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);                    btnshow = (Button) findViewById(R.id.btnshow);          txtshow = (TextView) findViewById(R.id.textshow);          //直接new一個外部類,並把TextView作為參數傳入          btnshow.setOnClickListener(new MyClick(txtshow));                }       }  


                                                                                                                                                                           




④直接使用Activity作為事件監聽器

只需要讓Activity類實現XxxListener事件監聽介面,在Activity中定義重寫對應的事件處理器方法

eg:Actitity實現了OnClickListener介面,重寫了onClick(view)方法

在為某些組建添加該事件監聽對象時,直接setXxx.Listener(this)即可


還是一開始的那個布局效果;


代碼:

MainActivity.java

package com.jay.example.innerlisten;  import android.os.Bundle;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.Toast;  import android.app.Activity;    //讓Activity方法實現OnClickListener介面  public class MainActivity extends Activity implements OnClickListener{        private Button btnshow;            @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);                    btnshow = (Button) findViewById(R.id.btnshow);          //直接寫個this          btnshow.setOnClickListener(this);                }        //重寫介面中的抽象方法      @Override      public void onClick(View v) {          Toast.makeText(getApplicationContext(), "點擊了按鈕", Toast.LENGTH_SHORT).show();              }       }  


                                                                                                                                                                           



⑤直接綁定到標籤:

就是直接在xml布局檔案中對應得Activity中定義一個事件處理方法

eg:public void myClick(View source)   source對應事件來源(組件)

接著布局檔案中對應要觸發事件的組建,設定一個屬性:onclick = "myclick"即可


同樣是哪個點擊後提示toast資訊的例子:


代碼:


MainActivity.java

package com.jay.example.caller;    import android.app.Activity;  import android.os.Bundle;  import android.view.View;  import android.widget.Toast;      public class MainActivity extends Activity {          @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);       }            //自訂一個方法,傳入一個view組件作為參數      public void myclick(View source)      {          Toast.makeText(getApplicationContext(), "按鈕被點擊了", Toast.LENGTH_SHORT).show();      }  }  


main.xml布局檔案:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:id="@+id/LinearLayout1"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical" >            <Button           android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:text="按鈕"          android:onClick="myclick"          />        </LinearLayout>  




















最好的安卓入門書籍有什 (42的)

瘋狂Android講義(第二版)就是在4.2的版本上講解的
 
錯誤提示

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.