为了账号安全,请及时绑定邮箱和手机立即绑定

访问onCreate()中的视图的NullPointerException

访问onCreate()中的视图的NullPointerException

有只小跳蛙 2019-05-25 16:02:44
访问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>
查看完整描述

4 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

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

视图位于片段布局(fragment_main.xml)中,而不在活动布局(activity_main.xml)中。onCreate()在生命周期中太早,无法在活动视图层次结构中找到它,并null返回a。调用方法null会导致NPE。

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

@Overridepublic 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()


查看完整回答
反对 回复 2019-05-25
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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

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

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

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


查看完整回答
反对 回复 2019-05-25
?
慕森王

TA贡献1777条经验 获得超3个赞

尝试将访问视图转移到片段的onViewCreated方法,因为有时当您尝试访问onCreate方法中的视图时,它们不会在此时呈现,从而导致空指针异常。

 @Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
     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();
    }
 }


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 547 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信