這篇文章主要想寫一下Android實現監聽點擊事件的幾種方法,Activity和Fragment實現起來有些方法上會有些不一樣,這裏也略作介紹。編程
最近一直在忙一個項目,深感掌握監聽事件的重要性,同時也要綜合運用實現監聽的幾種方法,在編寫代碼的時候正確選擇,既能減小代碼量,代碼的可讀性也會更高。設計模式
一、全部的控件均可以註冊監聽來實現點擊後執行某項操做,這並非只有Button這類的組件特有的功能。ide
二、 通常來講每一個控件使用上面的第一種方法--使用匿名內部類的形式都是相似下面這種:this
Button mButton; mButton=(Button)findViewById(R.id.xx); mButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ //這裏執行具體點擊後的操做
} });
但並非每個組件的實現方式都是上面這種,這裏我舉兩個例子給你們參考:spa
(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爲咱們節省了不少工夫,也隱去了不少細節。code
舉這兩個例子也是但願你們能正確使用匿名內部類爲控件註冊監聽。blog
三、在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的編程很實用,仍是須要好好掌握。
像上面這樣特殊的你們能夠多積累,有點印象知道怎麼用就行。
好了,下面詳細看看上面的三種方法:
這裏和上面的代碼有些重複,你們參考一下就好。
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()必定要記得寫,我本身也常常犯這樣的錯誤,調試半天才發現是這個沒寫。
這後面兩種都比較容易理解,這裏我直接給出代碼:
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; } } }
代碼以下:
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 設計模式也並不適用。
MVVM設計模式,實質上就是 MVC的改進版,MVVM 就是將其中的View 的狀態和行爲抽象化,讓咱們將視圖 UI 和業務邏輯分開,這也使得咱們能直接在 XML 文件中直接操做控件點擊事件,固然代碼的編寫就不是上面那樣的,你們有興趣的能夠再自行上網查閱資料。
接觸Android很少,是個菜鳥,上面有錯誤的地方還請你們指正,但願能和你們多交流。