我知道在初始化任何视图之前我们需要在setContentView()
方法中放置onCreate()
否则会抛出空指针异常。
但是它的原因是什么?setContentView()
是否与inflate()
方法相似?
答案 0 :(得分:1)
在初始化任何视图之前
我不确定“初始化任何视图”的含义。鉴于你的其余问题,我将把这解释为“对活动打电话findViewById()
”。
您需要在致电setContentView()
之前致电findViewById()
,否则无法找到小部件。
如果您将布局资源ID传递到setContentView()是否类似于inflate()方法?
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之前进行膨胀。