从 xml 文件中扩充视图是啥意思?
Posted
技术标签:
【中文标题】从 xml 文件中扩充视图是啥意思?【英文标题】:What does it mean to inflate a view from an xml file?从 xml 文件中扩充视图是什么意思? 【发布时间】:2011-06-02 08:34:51 【问题描述】:我是 android 开发的新手,并且经常从布局 xml 文件中看到对 Inflating 视图的引用。我用谷歌搜索并搜索了开发指南,但仍然无法理解它的含义。如果有人能提供一个非常简单的例子,将不胜感激。
【问题讨论】:
【参考方案1】:当您编写 XML 布局时,它会被 Android 操作系统膨胀,这基本上意味着它将通过在内存中创建视图对象来呈现。我们称之为隐式膨胀(操作系统会为您膨胀视图)。例如:
class Name extends Activity
public void onCreate()
// the OS will inflate the your_layout.xml
// file and use it for this activity
setContentView(R.layout.your_layout);
您还可以使用LayoutInflater
显式扩展视图。在这种情况下,您必须:
-
获取
LayoutInflater
的实例
指定要扩展的 XML
使用返回的View
使用返回视图设置内容视图(上)
例如:
LayoutInflater inflater = LayoutInflater.from(YourActivity.this); // 1
View theInflatedView = inflater.inflate(R.layout.your_layout, null); // 2 and 3
setContentView(theInflatedView) // 4
【讨论】:
如果inflate = rendering,那么onDraw()到底有什么用呢? @sylvainulg,R.id.view 用于更改 xml 元素的属性,inflate 也可以这样做。膨胀在自定义视图中特别有用。为了对整个 xml 文件进行充气,使用了我们熟悉的 Activity 类的 setContentView。 View 必须使用 LayoutInflater object.inflate() 手动为每个 View 充气。一个活动有一个生命周期。视图有一个绘制周期。 inflater 对于自定义视图特别有用,而不是在 XML 文件中使用预定义布局。 我不认为膨胀是渲染,而是膨胀是基于 xml 文件内容在内存中实际创建 View 对象。膨胀后,视图将在内存中不一定可见。 也许render有两个意思?就像从布局文件渲染到对象,然后在屏幕上渲染。与 Web 开发类似,您将模板呈现为 html 页面,然后浏览器在屏幕上呈现该页面。也许答案是关于第一个含义而 cmets 关于第二个含义?或者可能是错的,我不知道。 @MattJ。好吧,我的回答可能措辞不佳。 Android 会inflate 视图,不仅仅是通过在某处放置 XML,而是当您调用 setContentView 或手动扩展布局时。当您调用findViewById
时,视图对象已经在内存中,您这样做的唯一原因是获取对该特定对象的引用(更改它或从中获取数据)。【参考方案2】:
“膨胀”视图意味着获取布局 XML 并对其进行解析,以根据其中指定的元素及其属性创建视图和视图组对象,然后将这些视图和视图组的层次结构添加到父视图组。当您调用 setContentView() 时,它会将通过读取 XML 创建的视图附加到活动。您还可以使用 LayoutInflater 将视图添加到另一个 ViewGroup,这在很多情况下都是有用的工具。
【讨论】:
这听起来对我来说是一个更准确的描述。 我自己仍然对“通货膨胀”术语感到有些困惑。 (如果我只能停止想象空气进入某物)。但也许这会有所帮助:我刚刚在 Ubuntu 终端上运行解压缩程序并注意到术语:“inflating:X/Y/z.xml”。我想这确实是同一个概念。 "Inflating" 在这种情况下意味着框架从 XML 中获取布局描述并使用实际的 View 对象填充视图层次结构。所以,它在填充布局的意义上是膨胀的。 @FranciscoCorrales - 当然。你最常使用这种东西的是ListAdapter,你想在其中填充一行。我用它来填充诸如 LinearLayouts 之类的东西,以一种不建议使用 ListAdapter 方法的方式迭代某些数据对象。【参考方案3】:Inflating 是在运行时将视图 (.xml) 添加到活动的过程。当我们创建一个 listView 时,我们会动态地膨胀它的每个项目。如果我们想创建一个包含多个视图(如按钮和文本视图)的 ViewGroup,我们可以这样创建它:
Button but = new Button();
but.setText ="button text";
but.background ...
but.leftDrawable.. and so on...
TextView txt = new TextView();
txt.setText ="button text";
txt.background ... and so on...
然后我们必须创建一个布局,我们可以在其中添加上面的视图:
RelativeLayout rel = new RelativeLayout();
rel.addView(but);
现在如果我们想在右上角添加一个按钮并在底部添加一个文本视图,我们必须做很多工作。首先通过实例化视图属性,然后应用多个约束。这很耗时。
Android 让我们可以轻松地创建一个简单的 .xml 并在 xml 中设计其样式和属性,然后在需要的地方简单地对其进行扩展,而无需以编程方式设置约束。
LayoutInflater inflater =
(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View menuLayout = inflater.inflate(R.layout.your_menu_layout, mainLayout, true);
//now add menuLayout to wherever you want to add like
(RelativeLayout)findViewById(R.id.relative).addView(menuLayout);
【讨论】:
我喜欢您通过展示手动操作的方式来描述通货膨胀的实际情况。 inflate的参数attachToRoot是什么意思? 查看详细回答***.com/questions/12567578/…【参考方案4】:我认为这里“膨胀视图”是指获取 layout.xml 文件,绘制该 xml 文件中指定的视图,并使用创建的视图填充(=膨胀)父 viewGroup。
【讨论】:
【参考方案5】:通货膨胀的外行定义可能是将 XML 代码转换为 Java 代码。只是一种理解方式,例如,如果我们在 XML 中有一个标签,OS 必须在内存中创建一个对应的 Java 对象,因此 inflatter 读取 XML 标记,并在 Java 中创建相应的对象。
【讨论】:
【参考方案6】:因为我们将 UI 转换为 XML,但我们显示的是视图对象,所以我们需要以某种方式将 xml 转换为视图对象,所以膨胀意味着我们将 xml 转换为视图对象以便它可以显示,为此我们需要一个名为布局充气机服务并给它一个xml,它将为您转换。
【讨论】:
【参考方案7】:在 iOS UIKit 世界中,这意味着获取对 .Xib(它是 XML,就像 android)文件的引用并添加 将其添加到当前 ViewController 的视图层次结构中。
【讨论】:
以上是关于从 xml 文件中扩充视图是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章