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不多,是個菜鳥,上面有錯誤的地方還請大家指正,希望能和大家多交流。
本文系原創,轉載還請注明出處。