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)。
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);
}
});
}
Intent intent = new Intent(getApplicationContext(), TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 非 Activity Context 必加
startActivity(intent);
Intent intent = new Intent(v.getContext(), TargetActivity.class);
startActivity(intent);
// Fragment 內
listView.setOnItemClickListener((parent, view, position, id) -> {
Intent intent = new Intent(requireContext(), TargetActivity.class);
startActivity(intent);
// 或
// Intent intent = new Intent(getActivity(), TargetActivity.class);
});
this 非外部 Activity,切記加類名 OuterClass.this。getApplicationContext() 不能啟動普通 Activity 除非加 FLAG_ACTIVITY_NEW_TASK,且無法接收 onActivityResult。v.getContext() 通常返回 Activity,但若 View 被異構持有(如 Dialog)、可能非 Activity,建議統一用 ActivityName.this。搞清 this 指向,是 Android 開發基礎功,匿名類回調中永遠顯式指定 OuterClass.this。