未使用 setContentView() 时出现 NullPointerException 的原因

Reason for NullPointerException if setContentView() is not used

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

before initializing any view

我不确定你说的 "initializing any view" 是什么意思。考虑到你的其余问题,我将把它解释为 "call findViewById() on the activity".

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

Is the setContentView() similar to the inflate() method?

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

setContentView() 将在幕后使用 LayoutInflaterinflate()

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

这就像你的桶里有东西,为了安全起见锁上了盖子,你回家时没有带桶,把它忘在车里了,你妈妈让你把东西一件一件地放在厨房柜台上,但是你没有水桶??所以首先你会得到桶然后你会从中取出物品。

首先你必须在你的 activity 中有一个 Container 这样你就可以通过使用它们来引用它的 items ID 在布局 xml 中分配。 希望你清楚。!

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

Ok but why we have to call setContentView() ?

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

setContentView() similar to the inflate() method ?

有些方法,因为两者都在做同样的事情,从给定的 xml 布局文件渲染视图,但工作范围不同。 setContentView() 在整个 activity 范围内提供视图,而 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 之前膨胀。