0

我知道我们需要在初始化任何视图之前将其放入setContentView()方法中onCreate(),否则它将引发空指针异常。但是是什么原因呢?是不是和方法setContentView()差不多inflate()

4

3 回答 3

1

在初始化任何视图之前

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

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

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

setContentView()如果您将布局资源 ID 传递到方法中,将在幕后使用LayoutInflaterand 。inflate()setContentView()

于 2015-06-13T18:39:44.237 回答
0

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

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

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

于 2015-06-13T18:51:51.460 回答
0

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

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

因此,当您调用setContentView()应用程序活动时,意味着 android nutshell 将呈现视图并从布局文件中为您的活动准备视图层次结构。请记住,您已经使用 xml 文件在布局中定义了视图,并且您正在 Java 代码中使用这些视图,因此为您准备视图的所有工作都会这样做setContentView(),这就是为什么当您调用时findViewById()没有setContentView()然后您的应用程序无法从视图层次结构中找到视图并且它会抛出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 之前进行膨胀。

于 2015-06-13T18:53:12.327 回答