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

Android 打磚塊遊戲代碼錯誤修復:內部類中 this 指向問題

     編輯:程式設計綜合問答

錯誤現象

在 OnClickListener 匿名內部類中創建 BallView:


kaishi.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v) {
        // ...
        myview = new BallView(this); // 錯誤:this 指向 OnClickListener 實例,而非 Activity
        setContentView(myview);
    }
});

編譯錯誤:BallView(Context) 需要 Context,但 this 是 OnClickListener。

修正方法

使用外部類限定 this:


myview = new BallView(DazhuankuaiActivity.this); // 正確:指向 Activity 實例

完整修正片段


kaishi.setOnClickListener(new View.OnClickListener() { // 接口用 View.OnClickListener
    @Override
    public void onClick(View v) {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        screenWidth = dm.widthPixels;
        screenHeight = dm.heightPixels;
        
        requestWindowFeature(Window.FEATURE_NO_TITLE); // 必須在 setContentView 前調用
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                             WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        myview = new BallView(DazhuankuaiActivity.this); // 關鍵修正
        setContentView(myview);
    }
});

代碼結構優化建議

原代碼將遊戲邏輯 (BallView) 與主 Activity 混在一個文件,且 BallView 靜態依賴 DazhuankuaiActivity.screenWidth,耦合度極高。建議重構:

  1. 分離文件:BallView.java 獨立類,構造函數傳入 Context 和 尺寸參數。
  2. 移除靜態依賴:
    
    public BallView(Context context, int screenWidth, int screenHeight) {
        this.screenWidth = screenWidth;
        this.screenHeight = screenHeight;
        // ...
    }
    
  3. 使用 SurfaceView 正確生命周期:在 surfaceCreated 啟動線程,surfaceDestroyed 停止線程 (原代碼已基本正確)。
  4. 觸摸/按鍵事件分離:BallView 覆寫 onTouchEvent 處理觸摸,或由 Activity 分發按鍵事件。
  5. 常量提取:將魔數 (睡眠時間、半徑、速度等) 定義為 static final 常量。

關鍵錯誤總結表

錯誤代碼問題修正
new BallView(this) 在 OnClickListener 中this 是 Listener,非 Contextnew BallView(OuterActivity.this)
requestWindowFeature 在 setContentView 後必須在 setContentView 前調用移至 onCreate 最開頭或 setContentView 前
靜態訪問 DazhuankuaiActivity.screenWidth強耦合、難測試、記憶體洩漏風險構造函數傳參或接口回調

總結

匿名內部類中訪問外部 Activity 實例,**必須用 OuterClass.this**。遊戲開發中,視圖與邏輯解耦、生命周期正確管理、常量提取,是可維護代碼的基石。

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