【问题标题】:Reason for NullPointerException if setContentView() is not used如果未使用 setContentView(),则出现 NullPointerException 的原因
【发布时间】:2015-06-13 18:35:56
【问题描述】:

我知道我们需要在初始化任何视图之前将setContentView() 放在onCreate() 方法中,否则会抛出空指针异常。 但是这是什么原因呢?setContentView()inflate()的方法是不是类似?

【问题讨论】:

    标签: android layout-inflater setcontentview


    【解决方案1】:

    在初始化任何视图之前

    我不确定您所说的“初始化任何视图”是什么意思。鉴于您的其余问题,我将其解释为“在活动中致电 findViewById()”。

    您需要在调用findViewById() 之前调用setContentView(),否则将找不到小部件。

    setContentView() 和 inflate() 方法类似吗?

    如果您将布局资源 ID 传递给 setContentView() 方法,setContentView() 将在幕后使用 LayoutInflaterinflate()

    【讨论】:

      【解决方案2】:

      如果没有设置内容视图,那么您将从那里引用视图,如 EditText、TextView、ListVIew 以及您在布局中使用的所有其他组件。

      就像你的桶里有东西,它的盖子为了安全而上锁,你没有桶进屋,把它忘在车里,你妈妈让你把物品一个接一个地放在厨房柜台上,但你没有没有桶??所以首先你会得到桶然后你会从中取出物品。

      首先,您的活动中必须有一个 Container,以便您可以使用分配的 ID 来引用其 items布局xml。 希望你清楚。!

      【讨论】:

        【解决方案3】:

        好的。同意@CommonsWare。在某些细节中,假设您在 xml 布局文件中定义了一些视图并且您想在您的活动中使用这些视图,因此在这种情况下您必须调用 setContentView(<R.layout.xml_layout_name>),然后使用 findViewById(R.id.<view_name>) 初始化视图资源名称作为您的 xml 布局定义的名称。

        好的,但为什么我们必须打电话给setContentView()

        因此,当您调用setContentView() 应用程序活动时,意味着android nutshell 将呈现视图并从布局文件为您的活动准备视图层次结构。请记住,您已经使用 xml 文件在布局中定义了视图,并且您正在 Java 代码中使用这些视图,因此为您准备视图的所有工作都将执行 setContentView() 这就是为什么当您在没有 setContentView() 的情况下调用 findViewById() 时,您的应用程序无法从视图层次结构中找到视图,它将抛出NullPointerException

        setContentView() 类似于inflate() 方法?

        有些方法,因为两者都在做同样的事情,从给定的 xml 布局文件渲染视图,但工作范围不同。 setContentView() 在整个活动范围内提供视图,而 inflate() 只会为您提供布局文件中的视图,这就是为什么每当您使用 inflate() 时,您必须始终使用 return view 的引用来调用 findViewById() 之类的

        伪代码仅供大家理解,

        View view = infalter.inflate(<R.layout.<file_name>>);
        TextView mextView = view.findViewById(R.id.textView); 
        

        是的,setContentView() 也使用相同的 inflater.inflate() 方法。

        什么时候不需要setContentView()inflate()

        如果您在 java 代码中创建动态视图,那么您不必调用 setContentView()inflate()

        注意:在旧的 android 版本中,当您使用 java 代码创建动态视图并将其传递给某些 ListView 的页眉或页脚时,它将无法正常工作。对于此视图必须在设置为 ListView 之前进行膨胀。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          相关资源
          最近更新 更多