1. 程式人生 > >Android實現監聽控制元件點選事件

Android實現監聽控制元件點選事件

Android實現監聽控制元件點選事件

引言

         這篇文章主要想寫一下Android實現監聽點選事件的幾種方法,Activity和Fragment實現起來有些方法上會有些不同,這裡也略做介紹。

         最近一直在忙一個專案,深感掌握監聽事件的重要性,同時也要綜合運用實現監聽的幾種方法,在編寫程式碼的時候正確選擇,既能減少程式碼量,程式碼的可讀性也會更高。

 

 

總結

     1、通過匿名內部類實現監聽

      2、直接實現監聽介面實現監聽

      3、自定義內部類實現介面實現監聽

 

 

一些我想說的:

       1、所有的控制元件都可以註冊監聽來實現點選後執行某項操作,這並不是只有Button這類的元件特有的功能。

       2、 一般來說每個控制元件使用上面的第一種方法--使用匿名內部類的形式都是類似下面這種:

Button mButton;

mButton=(Button)findViewById(R.id.xx);

mButton.setOnClickListener(new OnClickListener(){
     @Override
     public void onClick(View v){
          //這裡執行具體點選後的操作

     }
});

 

 但並不是每一個元件的實現方式都是上面這種,這裡我舉兩個例子給大家參考:

       (1)、ListView利用匿名內部類實現監聽

ListView mListView=(ListView)findViewById(R.id.xx);

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
     @Override
     public void onItemClick(AdapterView<?> parent,View view,int position,long id){
          //這裡執行具體操作

      }
});
       

 

 

       (2)、RecyclerView利用匿名內部類實現監聽

 

//定義ViewHolder內部類
private class xxxx extends RecyclerView.ViewHolder {

        public xxxx(LayoutInflater inflater,ViewGroup parent){
            super(inflater.inflate(R.layout.list_item,parent,false));
            itemView.setOnClickListener(new RecyclerView.OnClickListener(){

                @Override
                public void onClick(View v) {
                    Toast.makeText(getActivity(),"點選按鈕", Toast.LENGTH_LONG).show();
                }
            });
       }
}

 

 在這點上面RecyclerView還是更高階一些,內部實現的這個itemView為我們節省了很多工夫,也隱去了很多細節。

 

舉這兩個例子也是希望大家能正確使用匿名內部類為控制元件註冊監聽。

 

       3、在Fragment的寫法略有區別,這點大家要注意,這裡將上面那個Button的修改為在Fragment中

Button mButton;

mButton=(Button)View.findViewById(R.id.xx);

mButton.setOnClickListener(new View.OnClickListener(){
     @Override
     public void onClick(View v){
          //這裡執行具體點選後的操作

     }
});

 

只是在findViewById()方法前也要記得加View,還有一些是加getActivity()方法的,Fragment的程式設計很實用,還是需要好好掌握。

像上面這樣特殊的大家可以多積累,有點印象知道怎麼用就行。

好了,下面詳細看看上面的三種方法:

 

 

    1、通過匿名內部類實現監聽

      這裡和上面的程式碼有些重複,大家參考一下就好。

public class MainActivity extends AppCompatActivity {

    private Button login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        login = (Button) findViewById(R.id.login);

        login.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                
                 Toast.makeText(MainActivity.this,"點選登入",Toast.LENGTH_SHORT).show();

             }
     });
}
}

 

上面的程式碼Toast後面的show()一定要記得寫,我自己也經常犯這樣的錯誤,除錯半天才發現是這個沒寫。

 

 

    2、直接實現介面實現監聽

      這後面兩種都比較容易理解,這裡我直接給出程式碼:

 

public class MainActivity extends AppCompatActivity implements View.OnClickListener{


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button mButton=(Button)findViewById(R.id.create_database);
        mButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.create_database:
                //執行具體操作
                break;
                
            default:
                break;
        }
    }
}

 

 

    3、自定義內部類實現介面實現監聽

      程式碼如下:

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button mButton=(Button)findViewById(R.id.create_database);
        mButton.setOnClickListener(new MyButtonListener());
    }

   class MyButtonListener implements View.OnClickListener{

       @Override
       public void onClick(View v) {
           switch (v.getId()){
               case R.id.create_database:
                   //執行具體操作
                   break;
                   
               default:
                   break;
           }
       }
   }
}

 

 

當然,這裡也可以不用內部類來實現,新建一個類來繼承View.OnClickListener介面也是可以的,不過我並不建議這種做法,這樣寫還不如直接在本類中繼承介面。

 

 我的一些看法:

這上面的三種方法實際上就是一種方法,只是通過不同方式來實現繼承View.OnClickListener介面,看個人習慣,掌握了類的繼承這三種方法都好理解。

就我個人的建議,當需要註冊監聽事件的控制元件較少時,使用匿名內部類得到方法會直觀便捷一些,當這類的控制元件較多時,利用第二或者第三種會好一些,畢竟不用每一個去重寫 onClick() 方法。

 

 

 

 

 

總結:

這上面和大家分享了一下 Android 實現註冊監聽的幾種方法,也分享了一下我自己的看法,實質還是介面的繼承,好好理解類的繼承相信這上面的完全不是問題。

在實現上也要注意 Activity 和 Fragment 的區別,不行就在方法前加一個 View 或者getActivity() 之類的,多積累 Fragment 在介面編輯上還是很實用的。

 

注:本文是Android基於MVC設計模式。

這裡大家可以考慮一個問題,在按鈕控制元件很少的情況下我們可以在程式碼中通過註冊監聽的情況實現監聽點選,但在實際中的Android專案都是十分龐大的,特別像手機遊戲這類的,利用這類方法去實現顯然時很吃力的,顯然 MVC 設計模式也並不適用。

MVVM設計模式,實質上就是 MVC的改進版,MVVM 就是將其中的View 的狀態和行為抽象化,讓我們將檢視 UI 和業務邏輯分開,這也使得我們能直接在 XML 檔案中直接操作控制元件點選事件,當然程式碼的編寫就不是上面那樣的,大家有興趣的可以再自行上網查閱資料。

 

 

接觸Android不多,是個菜鳥,上面有錯誤的地方還請大家指正,希望能和大家多交流。

 

 

 

本文系原創,轉載還請註明出處。

 

 

&n