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

Android OnClickListener 正確寫法:View 必須在 setContentView 後初始化

     編輯:程式設計綜合問答

錯誤代碼分析

public class MainActivity extends Activity implements OnClickListener {
    EditText centimeters = (EditText) findViewById(R.id.editCentimeters); // 錯誤:此時 View 尚未建立
    EditText inches = (EditText) findViewById(R.id.editInches);
    Button btnConverter = (Button) findViewById(R.id.button);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 佈局在此行才充氣
        btnConverter.setOnClickListener(this); // btnConverter 仍為 null
    }
    ...
}

成員變數初始化階段執行 findViewById,但 setContentView 尚未執行,導致所有 View 為 null,點擊時拋出 NullPointerException。

正確模式:宣告在前,初始化在 onCreate 內

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    // 1. 僅宣告,不初始化
    private EditText centimeters;
    private EditText inches;
    private Button btnConverter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 2. 先充氣佈局
        setContentView(R.layout.activity_main);

        // 3. 再 findViewById
        centimeters = findViewById(R.id.editCentimeters);
        inches = findViewById(R.id.editInches);
        btnConverter = findViewById(R.id.button);

        // 4. 設定監聽器
        btnConverter.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.button) {
            String cmStr = centimeters.getText().toString().trim();
            if (cmStr.isEmpty()) return;
            double cm = Double.parseDouble(cmStr);
            double inch = cm * 0.393701;
            inches.setText(String.format(Locale.getDefault(), "%.2f", inch));
        }
    }
}

關鍵原則

  1. 生命週期順序:onCreate → setContentView → findViewById → 設定監聽器/資料。
  2. 使用 AppCompatActivity:支援 Material 元件、向下相容。
  3. 空值防護:getText().toString().trim() 檢查空字串,避免 NumberFormatException。
  4. 格式化輸出:String.format(Locale.getDefault(), "%.2f", value) 固定小數位,避免科學記號。

現代替代:View Binding / Data Binding

開啟 buildFeatures { viewBinding = true } 後,自動生成綁定類別,完全消除 findViewById 與空指針風險:

private ActivityMainBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    binding.button.setOnClickListener(v -> {
        String cmStr = binding.editCentimeters.getText().toString().trim();
        if (!cmStr.isEmpty()) {
            double cm = Double.parseDouble(cmStr);
            binding.editInches.setText(String.format(Locale.getDefault(), "%.2f", cm * 0.393701));
        }
    });
}

View Binding 是目前 Google 官方推薦標準,新專案請優先採用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved