如果未使用setContentView(),则为NullPointerException的原因

时间:2015-06-13 18:35:56

标签: android layout-inflater setcontentview

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

3 个答案:

答案 0 :(得分:1)

  

在初始化任何视图之前

我不确定“初始化任何视图”的含义。鉴于你的其余问题,我将把这解释为“对活动打电话findViewById()”。

您需要在致电setContentView()之前致电findViewById(),否则无法找到小部件。

  

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

如果您将布局资源ID传递到setContentView()方法,

LayoutInflater将使用inflate()setContentView()

答案 1 :(得分:0)

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

就像你的水桶中有物品而且它的盖子是为了安全而被锁上,你没有桶就进来了,忘记了它在车里,而你的妈妈要求你把1件物品放在厨房柜台上,但你不要没斗?所以首先你会得到桶然后你会从中取出物品。

首先,您必须在活动中设置容器,以便您可以使用 ID 来引用其 ID 布局xml。 希望你能清楚。!

答案 2 :(得分:0)

确定。同意@CommonsWare。在一些细节中,假设您在xml布局文件中定义了一些视图,并且希望在活动中使用这些视图,因此在这种情况下,您必须调用setContentView(<R.layout.xml_layout_name>),然后使用{{inititlalize视图1}}使用资源名称作为xml布局定义的名称。

  

好的,但为什么我们要拨打findViewById(R.id.<view_name>)

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

  

setContentView()类似于NullPointerException方法?

一些如何,因为两者都在做同样的事情,从给定的xml布局文件渲染视图,但工作范围是不同的。 setContentView()提供整个活动范围内的视图,而inflate()只会为您提供布局文件中的视图,这就是为什么无论何时使用inflate(),您都必须始终使用return setContentView()的引用拨打inflate()就像

一样

伪代码仅供您理解,

view

是的,findViewById()也使用相同的View view = infalter.inflate(<R.layout.<file_name>>); TextView mextView = view.findViewById(R.id.textView); 方法。

何时不需要setContentView()inflater.inflate()

如果您要创建动态视图,则在java代码中,您不必进行必需的调用setContentView()inflate()

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