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

Android Button 強制轉型為 EditText 導致 ClassCastException

     編輯:程式設計綜合問答

崩潰堆疊

java.lang.ClassCastException: android.widget.Button
    at com.example.android_4_2.MainActivity$1.onClick(MainActivity.java:28)

錯誤程式碼

Button bCall = (Button) findViewById(R.id.TelBtn);
bCall.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        EditText telnum = (EditText) findViewById(R.id.TelBtn); // 錯誤:同一 ID 強轉 EditText
        String telNum = telnum.getText().toString();
        ...
    }
});

原因分析

佈局 XML 中 R.id.TelBtn 對應的是 Button,但在 onClick 內再次 findViewById(R.id.TelBtn) 並強制轉型為 EditText,導致執行期 ClassCastException。

修正方法

  1. 在 XML 中為輸入框指定獨立 ID,例如 android:id="@+id/etPhoneNumber"。
  2. 在 onCreate 中分別取得兩個元件:
Button btnDial = (Button) findViewById(R.id.TelBtn);
EditText etPhone = (EditText) findViewById(R.id.etPhoneNumber);

btnDial.setOnClickListener(v -> {
    String num = etPhone.getText().toString().trim();
    if (PhoneNumberUtils.isGlobalPhoneNumber(num)) {
        startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + num)));
    } else {
        Toast.makeText(this, "號碼格式錯誤", Toast.LENGTH_LONG).show();
    }
});

最佳實踐

  • 使用 View Binding 或 Data Binding 避免手動 findViewById 與型別轉換錯誤。
  • ID 命名規範:btn_ 開頭對應 Button,et_ 開頭對應 EditText,tv_ 對應 TextView。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved