Android View的onClick事件監聽
點選事件
Android中Touch事件相關內容都被封裝到 MotionEvent 中,MotionEvent 中的時間型別有按下、擡起、滑動和結束事件。這些事件都是人機互動的一個過程,按下動作指的是人手指按在手機螢幕上這個動作,擡起動作指的是人手指按下手機後擡起來這個動作,移動動作指的是人手指按下屏幕後移動一段距離的這個動作。那麼當人手指按下後擡起,就完成了點選(onClick)這個動作。
MotionEvent.ACTION_DOWN:按下(按下動作)
MotionEvent.ACTION_UP:擡起(擡起動作)
MotionEvent.ACTION_MOVE:滑動(滑動動作)
MotionEvent.ACTION_CANCEL:結束事件(非人為)
在onClick事件中我們去監聽要去做什麼樣的動作,通過控制元件(View)自身的.setOnClickListener(OnClickListener)方法新增onClick事件,除了我們常用的按鈕(Button)之外,其他的控制元件也含有點選事件,通過點選事件的監聽可以實現點選按鈕之後要發生的動作(業務邏輯)。
findViewById()方法查詢對應的view的id
在資源目錄 res 資料夾下的所有資源(檔案以及資訊)系統都會自動在 gen 目錄中的 R.java 檔案中生成一個對應且唯一的id。我們可以通過這個唯一的id去查詢當前對應的內容。gen目錄下的所有檔案是不需要我們手動新增和修改的,它是會自動在編譯中生成,系統會自動對其進行操作。
R.id.XXX 這句話中的 R 指的就是 gen 目錄中的 R.java 檔案,R檔案中對應的id指的是我們需要去找的那個控制元件的id,控制元件id在我們編輯 xml 佈局檔案的時候給控制元件新增 android:id 屬性新增,R檔案中會自動生成與之對應的 id 值。所以我們訪問的是 R.id 中控制元件 id 對應的系統自動生成的id值。這樣子我們就可以訪問到當前這個控制元件。
//通過findViewById的方法查詢對應View的id btnOne = (Button) findViewById(R.id.btn_one);
監聽事件實現的幾種寫法
1.匿名內部類實現事件監聽
2.獨立類(外部類)實現事件監聽
3.實現OnClickListener介面實現事件監聽
4.重寫onClick(View view)方法實現事件監聽(標籤處理)
匿名內部類方式
要去監聽一個控制元件(View)的事件,我們需要去初始化控制元件。
就是說如果我們想要去為一個Button去新增一個點選事件的監聽,我們要去找到這個控制元件才可以對它進行操作和處理。
初始化控制元件首先是要宣告出來一個實體物件,然後對這個物件賦值,找到 xml 佈局檔案中對應的控制元件,在java原始碼檔案中通過 findViewById() 方法訪問控制元件的 id 返回一個控制元件物件。
然後通過控制元件物件自身的 .setOnClickListener(OnClickListener) 方法新增點選事件。這樣就是通過匿名內部類的方式的點選事件監聽。
//宣告初始化控制元件View(Button)
private Button btnOne;
//通過findViewById的方法查詢對應View的id,查詢id和實現監聽都寫在onCreate()生命週期中
btnOne = (Button) findViewById(R.id.btn_one);
//匿名內部類實現事件監聽
btnOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "通過匿名內部類實現點選事件監聽", Toast.LENGTH_SHORT).show();
tvShow.setText("通過匿名內部類實現點選事件監聽");
}
});
實現結果:
獨立類方式
這種實現方式比較少見,看起來跟通過匿名內部類實現事件監聽相似,但有些許不同。
通過獨立類實現事件監聽首先自定義 mOnClickListener 類,該類實現 OnClickListener 介面。然後自定義的監聽類會自動生成 onClick 方法,點選控制元件要進行的操作可以在這裡實現。
因為自定義監聽類中的onClick方法是public的,所以我們可以覆寫也可以不覆寫。當覆寫OnClick方法的時候會自動生成 super.onClick(view);這個語句是呼叫父類的onClick方法也就是我們自定義類中onClick方法中實現的內容。
如果我們在覆寫的 onClick 方法中寫入了實現邏輯,在自定義點選類( mOnClickListener )中也定義了實現邏輯,那麼我們在實現覆寫的 onClick 方法中的邏輯同時,因為 super.onClick(view); 的原因也會去實現父類中onClick()方法中的實現邏輯。
外部類實現監聽 View 點選事件的場景是當很多個控制元件在實現監聽的時候除了實現自己本身需要的邏輯之外,還要實現同樣的一個動作,那麼就可以通過外部類的方式去實現點選事件的監聽,將都需要實現的公共邏輯在外部類中實現,然後在覆寫的方法中去實現自己本身需要去實現的業務邏輯。
外部類的寫法就是提取一些邏輯內容相同的部分,減少程式碼的冗餘。用不用外部類去實現點選事件的監聽主要是看我們有沒有遇到需要這樣去實現的場景。
class mOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
Log.i("MS","通過獨立類實現點選事件監聽");
}
}
//MainActivity.java
//宣告初始化控制元件View(Button)
private Button btnTwo;
//通過findViewById的方法查詢對應View的id
btnOne = (Button) findViewById(R.id.btn_two);
//使用獨立類實現點選事件監聽
btnTwo.setOnClickListener(new mOnClickListener(){
@Override
public void onClick(View view) {
super.onClick(view);
Toast.makeText(MainActivity.this, "通過獨立類實現點選事件監聽", Toast.LENGTH_SHORT).show();
tvShow.setText("通過獨立類實現點選事件監聽");
}
});
實現結果:
實現OnClickListener介面方式
通過介面方式去實現監聽事件首先我們要讓需要處理的類去實現 OnClickListener 介面,實現這個介面後會讓我們去生成 onClick() 方法進行覆寫。這個時候業務邏輯實現的地方我們已經找到了,接下來我們來進行對控制元件view進行繫結的動作。
View的繫結首先是進行控制元件的宣告,然後通過findViewById查詢對應view的id,最後實現一個介面的方式實現監聽事件(view.setOnClickListener(this))。因為在我們當前類中實現的是一個介面, this 也就是訪問當前類的介面的一個物件,這樣寫完之後就是把當前onClick事件繫結到控制元件View上面去了。當我們點選View的時候它就會觸發當前onClick實現方法。
//當前類實現View.OnClickListener
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//宣告初始化控制元件View(Button)
private Button btnThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通過findViewById的方法查詢對應View的id
btnThree= (Button) findViewById(R.id.btn_three);
//this是訪問當前類的介面的一個物件,就是把當前OnClick事件繫結到控制元件view上面去
btnThree.setOnClickListener(this);
}
//通過介面方式實現事件監聽
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "通過介面方式實現事件監聽", Toast.LENGTH_SHORT).show();
tvShow.setText("通過介面方式實現事件監聽");
}
}
實現結果:
重寫onClick(View view)方式(標籤處理)
在XML佈局檔案的 onClick 標籤上繫結需要的方法,屬性值為方法名。之後在 java 原始檔中編輯該方法,將監聽內容寫入方法即可。
實現結果: