ใช้วิธีผิดในการใช้ตัวแปรแทนพารามิเตอร์ !!!
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
วิธีการที่เหมาะสม:
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/** check given view by assertion or cast as u wish */
if(v instance of Button) {
/** cast */
Button button = (Button) v;
/** we can perform some check up */
if(button.getId() == EXPECTED_ID) {
/** disable view */
button.setEnabled(false)
button.setClickable(false);
}
} else {
/** you can for example find desired view by root view */
Button bt = (Button) v.getRootView().findViewById(R.id.btId);
/*check for button */
if(bt!=null) {
/** disable button view */
...
} else {
/** according to @jeroen-bollen remark
* we made assumption that we expected a view
* of type button here in other any case
*/
throw new IllegalArgumentException("Wrong argument: " +
"View passed to method is not a Button type!");
}
}
}
});
แก้ไข: ในการตอบกลับถึง @ jeroen-bollen
View.OnClickListener
คือการเชื่อมต่อความหมายสำหรับการเรียกกลับจะถูกเรียกเมื่อมีมุมมองที่มีการคลิก
ด้วยการกำหนดวิธีการ
void onClick(View v);
เมื่อมีการคลิกมุมมองวัตถุคลาดูทำให้การเรียกกลับไปยังวิธี onClick () ส่งเป็นพารามิเตอร์ตัวเองดังนั้นพารามิเตอร์มุมมองที่เป็นโมฆะไม่ควรเกิดขึ้นหากมันเป็นข้อผิดพลาดการยืนยันมันอาจเกิดขึ้นเช่นเมื่อวัตถุคลาสดูถูกทำลายในขณะเดียวกัน ตัวอย่างที่เก็บรวบรวมโดย GC) หรือวิธีการแก้ไขเนื่องจากแฮ็ค
เล็กน้อยเกี่ยวกับอินสแตนซ์ของ & null
JLS / 15.20.2 ตัวดำเนินการเปรียบเทียบประเภทของอินสแตนซ์
ณ รันไทม์ผลลัพธ์ของตัวดำเนินการ instanceof เป็นจริงถ้าค่าของ Relational Expression ไม่เป็นโมฆะและการอ้างอิงอาจถูกส่งไปยัง ReferenceType โดยไม่ต้องเพิ่ม ClassCastException
มิฉะนั้นผลที่เป็นเท็จ
สามคำจากผู้เขียน
ถ้าคุณถามทำไม
มากที่สุดเพื่อหลีกเลี่ยง NullPointerException
รหัสอีกเล็กน้อยจะช่วยประหยัดเวลาของคุณในการติดตามบั๊กในภายหลังในรหัสของคุณและลดการเกิดความผิดปกติ
พิจารณาตัวอย่างต่อไปนี้:
View.OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
btnSend.setClickable(false);
}
});
btnSend.setOnClickListener(listener)
btnCancel.setOnClickListener(listener)