访问onCreate()中的视图的NullPointerException

访问onCreate()中的视图的NullPointerException

这是针对StackOverflow上经常发布的问题的规范问题。

我正在关注一个教程。我使用向导创建了一个新活动。我NullPointerException试图在我的活动中使用Views获取方法时得到。findViewById()onCreate()

活动onCreate()

@Overrideprotected 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>


有只小跳蛙
浏览 549回答 4
4回答

繁星coding

该教程可能已过时,尝试创建基于活动的UI,而不是向导生成的代码首选的基于片段的UI。视图位于片段布局(fragment_main.xml)中,而不在活动布局(activity_main.xml)中。onCreate()在生命周期中太早,无法在活动视图层次结构中找到它,并null返回a。调用方法null会导致NPE。首选的解决方案是将代码移动到片段onCreateView(),调用findViewById()膨胀的片段布局rootView:@Overridepublic&nbsp;View&nbsp;onCreateView(LayoutInflater&nbsp;inflater,&nbsp;ViewGroup&nbsp;container, &nbsp;&nbsp;&nbsp;&nbsp;Bundle&nbsp;savedInstanceState)&nbsp;{ &nbsp;&nbsp;View&nbsp;rootView&nbsp;=&nbsp;inflater.inflate(R.layout.fragment_main,&nbsp;container, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;false); &nbsp;&nbsp;View&nbsp;something&nbsp;=&nbsp;rootView.findViewById(R.id.something);&nbsp;//&nbsp;not&nbsp;activity&nbsp;findViewById() &nbsp;&nbsp;something.setOnClickListener(new&nbsp;View.OnClickListener()&nbsp;{&nbsp;...&nbsp;}); &nbsp;&nbsp;return&nbsp;rootView;}作为旁注,片段布局最终将成为活动视图层次结构的一部分,并且可以通过活动发现,findViewById()但仅在片段事务运行之后才能发现。待处理的片段事务在super.onStart()之后执行onCreate()。

慕无忌1623718

尝试OnStart()方法,只需使用View&nbsp;view&nbsp;=&nbsp;getView().findViewById(R.id.something);或使用getView().findViewById方法声明任何视图onStart()在视图上声明单击侦听器&nbsp;anyView.setOnClickListener(this);

慕森王

尝试将访问视图转移到片段的onViewCreated方法,因为有时当您尝试访问onCreate方法中的视图时,它们不会在此时呈现,从而导致空指针异常。&nbsp;@Overridepublic&nbsp;void&nbsp;onViewCreated(View&nbsp;view,&nbsp;@Nullable&nbsp;Bundle&nbsp;savedInstanceState)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;super.onViewCreated(view,&nbsp;savedInstanceState); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;something&nbsp;=&nbsp;findViewById(R.id.something); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;something.setOnClickListener(new&nbsp;View.OnClickListener()&nbsp;{&nbsp;...&nbsp;});&nbsp;//&nbsp;NPE&nbsp;HERE &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(savedInstanceState&nbsp;==&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getSupportFragmentManager().beginTransaction() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(R.id.container,&nbsp;new&nbsp;PlaceholderFragment()).commit(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android
Java