我知道我们需要在初始化任何视图之前将其放入setContentView()
方法中onCreate()
,否则它将引发空指针异常。但是是什么原因呢?是不是和方法setContentView()
差不多inflate()
?
3 回答
在初始化任何视图之前
我不确定您所说的“初始化任何视图”是什么意思。鉴于您的其余问题,我将其解释为“呼吁findViewById()
活动”。
您需要在调用setContentView()
之前先调用findViewById()
,否则将找不到小部件。
setContentView() 是否类似于 inflate() 方法?
setContentView()
如果您将布局资源 ID 传递到方法中,将在幕后使用LayoutInflater
and 。inflate()
setContentView()
如果没有设置内容视图,那么您将从那里引用视图,如 EditText、TextView、ListVIew 以及您在布局中使用的所有其他组件。
就好像你的桶里有东西,它的盖子为了安全而锁上了,你没有桶进屋,把它忘在车里,你妈妈让你把物品一个接一个地放在厨房柜台上,但你没有桶??所以首先你会得到桶,然后你会从中取出物品。
首先,您必须在活动中拥有一个容器,以便您可以使用布局 xml 中分配的ID来引用其项目。希望你清楚。!
好的。同意@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 之前进行膨胀。