This is a canonical question for a problem frequently posted on StackOverflow.

我正在学习一个教程.我使用向导创建了一个新活动.在我的活动onCreate()中,当我试图调用用findViewById()获得的View的方法时,我得到了NullPointerException.

活动onCreate():

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    View something = findViewById(R.id.something);
    something.setOnClickListener(new View.OnClickListener() { ... }); // NPE HERE

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}

布局XML(fragment_main.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="packagename.MainActivity$PlaceholderFragment" >

    <View
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/something" />

</RelativeLayout>

推荐答案

本教程可能已经过时,试图创建基于活动的UI,而不是向导生成的代码首选的基于片段的UI.

视图在片段布局(fragment_main.xml)中,而不是在活动布局(activity_main.xml)中.onCreate()在生命周期中太早,无法在"活动"视图层次 struct 中找到它,返回null.在null上调用方法会导致NPE.

首选的解决方案是将代码移动到片段onCreateView(),在inflating 的片段布局rootView上调用findViewById():

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
  View rootView = inflater.inflate(R.layout.fragment_main, container,
      false);

  View something = rootView.findViewById(R.id.something); // not activity findViewById()
  something.setOnClickListener(new View.OnClickListener() { ... });

  return rootView;
}

作为附注,片段布局最终将成为活动视图分层 struct 的一部分,并且只有在片段事务已经运行之后才能使用活动findViewById()来发现.挂起的片段事务在onCreate()之后在super.onStart()中执行.

Android相关问答推荐

如何让用户与我的应用生成的多个音频文件交互

泛型类型lambda函数参数作为函数参数

Android 14上的慢速意图广播交付

添加可组合元素的列表?

Android-LVL库始终返回NOT_SUBLISTED

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

为什么 Android Compose 将片段作为参数传递给 Composables 函数?

expo 上的 socket.io 无法从 Android 连接

Material 3的MaterialSwitch默认大小太大了?如何使它变小?

是什么导致调用 Firebase 服务器?

我如何比较多个时间范围并在 Android Compose 中并排显示它们

我的自定义小吃店不适合我的全宽屏幕尺寸

Jetpack Compose 中带有权重的行和 AnimatedVisibility 会 destruct UI

状态更改后 colored颜色 未正确更改

获取 ArithmeticException:除以零,但我没有在任何地方除以零

ionic - capacitor - Android 风味 - 无法在模拟器或真实设备中运行应用程序

Kotlin 调用带参数的函数 Any is xxx ||任何 yyy 都不起作用

如何在 MAUI 项目中包含每个平台的现有 C++ 库?

Jetpack 使用 Canvas 组成半圆

在使用 Retrofit 和 Room 时,我是否需要提及协程调度程序?