LayoutInflater和onFinishInflate()

5
我遇到了一个问题,就是findViewById()返回了空值,好像很多人也遇到了同样的问题。我知道findViewById()只能在onFinishInflate()中View被膨胀后才能调用。我的问题是——什么是视图膨胀?
在活动中,我调用setContentView(R.layout.testview)应该会调用View构造函数并调用onDraw()。那不就膨胀视图了吗?如果是这样,为什么还需要LayoutInflater和实际膨胀视图的功能呢?事实上,在我的代码中,onInflateView()从未被调用,尽管整个视图都被渲染出来,我也能够与程序交互。这告诉我,视图膨胀与调用View的构造函数和onDraw()函数有些不同。请问有人能解释一下吗?
另外,我有一个使用onDraw()函数绘制的自定义视图。不知为何,onFinishInflate()函数从未被调用。这可能是什么原因呢?
-P
1个回答

6
我的问题是 - 什么是视图膨胀?
视图膨胀是将布局XML文件转换为相应的View对象树的行为。您可以使用LayoutInflater手动执行此操作,或者Android可以通过setContentView()、内置Adapter类等为您执行此操作。
在Activity中调用setContentView(R.layout.testview),这应该调用View构造函数并调用onDraw()。那么这不是已经膨胀了视图吗?
setContentView()会膨胀提供的布局文件。
如果是这样,为什么还需要LayoutInflater和实际膨胀视图的函数?
因为有时您需要手动执行此操作,例如在具有不同类型行(例如标题和详细信息)的复杂ListView中。

谢谢!Google ApiDemos 中有类似的示例吗?另外,当使用 setContentView() 时,onFinishInflate() 什么时候被调用?在我的情况下根本没有被调用。 - user220201
@user220201: "Google ApiDemos 中有类似的示例吗?" -- 什么样的示例? "另外,setContentView() 何时调用 onFinishInflate()?在我的情况下根本没有被调用。" -- 我以前使用过 onFinishInflate(),并且它一直很好用,尽管我现在没有任何样例。请确保您有 @Override 注释,以防您在方法签名中犯了错误。 - CommonsWare
1
我在询问一个需要调用LayoutInflater的示例。 - user220201
@user220201:我不确定ApiDemos中是否有这个。当你有多种类型的行时,你可以使用它。PreferenceActivity只是一个带有许多不同行的ListActivity。你可以在这里看到手动调用LayoutInflater的示例:https://github.com/commonsguy/cw-android/tree/master/FancyLists/DynamicEx。然而,这只是一个简单的书本例子,所以它没有展示多个不同的行。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接