實現View.OnClickListener接口時,多按鈕點擊邏輯常寫成嵌套if導致後續分支永不執行。本文展示錯誤代碼、正確寫法及最佳實踐模式。
@Override
public void onClick(View v) {
if (v.getId() == R.id.imageButton1) {
Log.d("MEEP", "Image Button1 Pressed");
if (v.getId() == R.id.imageButton2) { // 永遠為false!同一View id不可能同時等於兩個值
Log.d("MEEK", "Image Button2 Pressed");
}
}
}
後果:第二個按鈕點擊時,外層if判斷失敗,內層代碼永不執行。
@Override
public void onClick(View v) {
if (v.getId() == R.id.imageButton1) {
Log.d("MEEP", "Image Button1 Pressed");
}
if (v.getId() == R.id.imageButton2) {
Log.d("MEEK", "Image Button2 Pressed");
}
// 更多按鈕...
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageButton1:
Log.d("MEEP", "Image Button1 Pressed");
break;
case R.id.imageButton2:
Log.d("MEEK", "Image Button2 Pressed");
break;
// case R.id.xxx: ...
}
}
避免巨大的onClick方法,為每個按鈕單獨設置監聽器:
findViewById(R.id.imageButton1).setOnClickListener(v -> handleButton1());
findViewById(R.id.imageButton2).setOnClickListener(v -> handleButton2());
private void handleButton1() { /* 具體業務 */ }
private void handleButton2() { /* 具體業務 */ }
優點:邏輯解耦、易測試、支持復用。Kotlin中更簡潔:button1.setOnClickListener { handleButton1() }。
// ViewBinding
binding.imageButton1.setOnClickListener { handleButton1() }
binding.imageButton2.setOnClickListener { handleButton2() }
編譯時綁定,避免findViewById空指針與ID寫錯。