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

Android 登錄按鈕點擊崩潰:onClick 方法定義在錯誤的 Activity 中

     編輯:程式設計疑難解答

問題現象

點擊登錄按鈕 (android:onClick="click") 後 App 停止運行 (Crash)。

根本原因

XML 佈局中的 android:onClick="click" 要求點擊處理方法定義在**加載該佈局的 Activity** 中。

  • 登錄頁面佈局 three.xml 由 MainActivity 加載 (setContentView(R.layout.three))。
  • 但 click(View v) 方法卻定義在 GUidt 類中 (或未定義在 MainActivity)。
  • 系統在 MainActivity 中找不到 click 方法 → 拋出 IllegalStateException: Could not find method click(View) → Crash。

修復方案:將 click 方法移至正確的 Activity

// MainActivity.java (加載 three.xml 的 Activity)
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.three); // 加載登錄佈局
    }

    // 關鍵:onClick 方法必須在這裡!
    public void click(View v) {
        Intent intent = new Intent(this, Activity01.class);
        startActivity(intent);
    }
}

AndroidManifest.xml 配置檢查

<application ...>
    <activity android:name="com.gfxy.znny.MainActivity">
        <!-- 若 MainActivity 是入口,需加 intent-filter -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
    <activity android:name="com.gfxy.znny.GUidt" /> <!-- 另一個 Activity -->
    <activity android:name="com.gfxy.znny.Activity01" /> <!-- 登錄後跳轉目標 -->
</application>

注意: 原清單文件中 GUidt 有 LAUNCHER intent-filter,而 MainActivity 沒有。若 MainActivity 是登錄頁入口,**必須將 intent-filter 移至 MainActivity**。

佈局文件關鍵點 (three.xml)

<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_alignParentRight="true"
    android:layout_marginRight="60dp"
    android:onClick="click" <!-- 系統會在 MainActivity 中查找 click(View) -->
    android:text="登錄"
    android:textColor="#000080" />

最佳實踐:棄用 xml onClick,改用代碼綁定 (更安全、可重構、可測試)

// MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.three);
    
    Button btnLogin = findViewById(R.id.button4);
    btnLogin.setOnClickListener(v -> {
        startActivity(new Intent(this, Activity01.class));
    });
}

優點: 編譯期檢查方法存在性、支持 Lambda、便於單元測試、避免反射性能損耗、重構時 IDE 自動更新引用。

總結

Crash 根因:android:onClick 方法定義在錯誤的 Activity (GUidt) 而非加載佈局的 Activity (MainActivity)。 修復:將 click(View) 移至 MainActivity,並確保 Manifest 入口配置正確。**強烈建議改用代碼 setOnClickListener 替代 XML onClick 屬性。**

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