首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 簡訊發送器 Crash 修復:按鈕點擊監聽器正確寫法

     編輯:程式設計綜合問答

錯誤現象

Activity 實作 OnClickListener,onClick(View v) 中用 switch(v.getId()) 判斷,但點擊後 App 崩潰(NullPointerException 或 ClassCastException)。

常見原因

  • Button btn = (Button) v; 強轉失敗:若佈局中該 ID 非 Button(如 ImageButton、TextView)。
  • findViewById 未在 setContentView 後呼叫,導致欄位為 null。
  • 匿名內部類/外部類引用混淆導致 this 指向錯誤。

推薦寫法:內部類獨立監聽器

public class SmsActivity extends Activity {
    private Button btnSend;
    private EditText etPhone, etContent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);
        btnSend = findViewById(R.id.btn_send);
        etPhone = findViewById(R.id.et_phone);
        etContent = findViewById(R.id.et_content);

        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override public void onClick(View v) {
                String phone = etPhone.getText().toString().trim();
                String content = etContent.getText().toString().trim();
                if (TextUtils.isEmpty(phone) || TextUtils.isEmpty(content)) {
                    Toast.makeText(SmsActivity.this, "請填寫完整", Toast.LENGTH_SHORT).show();
                    return;
                }
                SmsManager.getDefault().sendTextMessage(phone, null, content, null, null);
                Toast.makeText(SmsActivity.this, "發送成功", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

關鍵優勢

  • 避免 switch(v.getId()) 與強轉風險。
  • 直接捕獲欄位引用,程式碼清晰、除錯容易。
  • 符合單一職責,便於後續擴展(如權限檢查、發送狀態回調)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved