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

Android ListView setOnItemClickListener 中 Intent 構建報錯:this 指向錯誤的匿名類

     編輯:程式設計綜合問答

錯誤代碼

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView a, View v, int position, long id) {
        Intent intent = new Intent(this, TargetActivity.class); // 編譯錯誤
        startActivity(intent);
    }
});

錯誤信息:The constructor Intent(new AdapterView.OnItemClickListener(){}, Class) is undefined

原因分析

匿名內部類中 this 指向該匿名類實例(OnItemClickListener),而 Intent(Context, Class) 構造器需要 Context 類型參數(Activity/Service/Application)。

修正方法

1. 使用 外部類名.this(最常用)

public class MyActivity extends Activity {
    // ...
    listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView a, View v, int position, long id) {
            Intent intent = new Intent(MyActivity.this, TargetActivity.class);
            startActivity(intent);
        }
    });
}

2. 使用 getApplicationContext()(需注意生命周期)

Intent intent = new Intent(getApplicationContext(), TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 非 Activity Context 必加
startActivity(intent);

3. 使用 View 參數獲取 Context

Intent intent = new Intent(v.getContext(), TargetActivity.class);
startActivity(intent);

擴展:Fragment 中的正確寫法

// Fragment 內
listView.setOnItemClickListener((parent, view, position, id) -> {
    Intent intent = new Intent(requireContext(), TargetActivity.class);
    startActivity(intent);
    // 或
    // Intent intent = new Intent(getActivity(), TargetActivity.class);
});

避坑清單

  • 匿名類/Lambda 中 this 非外部 Activity,切記加類名 OuterClass.this。
  • getApplicationContext() 不能啟動普通 Activity 除非加 FLAG_ACTIVITY_NEW_TASK,且無法接收 onActivityResult。
  • v.getContext() 通常返回 Activity,但若 View 被異構持有(如 Dialog)、可能非 Activity,建議統一用 ActivityName.this。

搞清 this 指向,是 Android 開發基礎功,匿名類回調中永遠顯式指定 OuterClass.this。

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