NullPointerException 访问 onCreate() 中的视图

这是一个经常发布在StackOverflow上的问题的规范问题。

我正在学习教程。我已使用向导创建了一个新活动。当我尝试在我的活动中获得的s上调用方法时,我会得到。NullPointerExceptionViewfindViewById()onCreate()

活动: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>

答案 1

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

视图位于片段布局 () 中,而不是活动布局 () 中。 在生命周期中太早,无法在活动视图层次结构中找到它,则返回 a。调用 上的方法会导致 NPE。fragment_main.xmlactivity_main.xmlonCreate()nullnull

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

@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;
}

作为旁注,片段布局最终将成为活动视图层次结构的一部分,并且可以通过活动发现,但只有在片段事务运行之后才能发现。挂起的片段事务在 之后执行。findViewById()super.onStart()onCreate()


答案 2

尝试 OnStart() 方法,只需使用

View view = getView().findViewById(R.id.something);

或使用 onStart() 中的方法声明任何视图getView().findViewById

声明单击侦听器在视图上anyView.setOnClickListener(this);


推荐