从xml文件中扩展视图意味着什么?


278

我是android开发的新手,不断遇到来自布局xml文件的Inflating视图引用。我搜索并搜索了开发指南,但仍然无法理解它的含义。如果有人可以提供一个非常简单的示例,将不胜感激。

Answers:


257

编写XML布局时,Android操作系统会夸大 XML布局,这基本上意味着它将通过在内存中创建视图对象来呈现它。我们称其为隐式膨胀(操作系统将为您膨胀视图)。例如:

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。在这种情况下,您必须:

  1. 获取实例 LayoutInflater
  2. 指定要膨胀的XML
  3. 使用返回的 View
  4. 使用返回的视图设置内容视图(上方)

例如:

LayoutInflater inflater = LayoutInflater.from(YourActivity.this); // 1
View theInflatedView = inflater.inflate(R.layout.your_layout, null); // 2 and 3
setContentView(theInflatedView) // 4

24
如果inflate = rendering,那么onDraw()的用途是什么?
PypeBros

@ sylvainulg,R.id.view用于更改xml元素的属性,并且inflate可以执行相同的操作。膨胀在自定义视图中特别有用。为了膨胀整个xml文件,使用了熟悉的Activity类的setContentView。视图必须使用LayoutInflater object.inflate()手动为每个视图充气。活动具有生命周期。视图具有绘制周期。对于自定义视图,inflater特别有用,而不是在XML文件中使用predifiend布局。
Sree Rama

@Cristian请,您认为您可以在此给我一些建议/想法吗goo.gl/E37NSu
eddy

24
我不认为膨胀是渲染,而是膨胀是基于xml文件内容在内存中实际创建View对象。膨胀后,视图将在内存中不一定可见。
艾哈迈德(Ahmed)2015年

1
@MattJ。好吧,我的回答可能措辞不佳。Android不仅会通过在某处放置XML 来使视图膨胀,而且还会在您调用setContentView或手动使布局膨胀时膨胀。在您调用findViewById视图对象时,它们已经在内存中了,这样做的唯一原因是获取对该特定对象的引用(更改它或从中获取数据)。
克里斯蒂安

160

“膨胀”视图意味着获取布局XML并对其进行解析,以根据其中指定的元素及其属性创建视图和视图组对象,然后将这些视图和视图组的层次结构添加到父视图组。调用setContentView()时,它会将通过读取XML创建的视图附加到活动中。您还可以使用LayoutInflater将视图添加到另一个ViewGroup,这在许多情况下都是有用的工具。


22
对我来说,这听起来像是更准确的描述。
PypeBros 2012年

4
我自己还是对“通货膨胀”这个术语感到困惑。(如果我只能停止想象空气进入某物)。但这可能会有所帮助:我只是在Ubuntu终端上运行了解压缩程序,并注意到了术语:“膨胀:X / Y / z.xml”。我想这实际上是相同的概念。
Ben Ogorek'3

6
在这种情况下,“膨胀”表示框架正在从XML中获取布局描述,并使用实际的View对象填充视图层次结构。因此,从填充布局的意义上讲,它正在膨胀。
jjb 2014年

1
@FranciscoCorrales-当然。您最常使用这种东西的地方是ListAdapter之类的东西,您想在其中填充一行。我用它来填充诸如LinearLayouts之类的东西,以某种不建议使用ListAdapter方法的方式遍历某些数据对象。
jjb 2014年

36

膨胀是在运行时将视图(.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);

我喜欢您如何通过手动显示来描述实际的通货膨胀。
丹尼尔(Daniel)

1
膨胀参数的attachToRoot是什么意思?
flz


5

我认为这里的“放大视图”是指获取layout.xml文件,以绘制该xml文件中指定的视图,并使用创建的View将父viewGroup进行POPULATING(= inflating)。


4

通货膨胀的外行定义可能是将XML代码转换为Java代码。这只是一种理解方式,例如,如果我们有XML标记,则OS必须在内存中创建相应的Java对象,因此,inflatter会读取XMLtag,并以Java创建相应的对象。


2

因为我们将UI转换为XML,但是显示的是视图对象,所以我们需要将xml转换为视图对象,因此膨胀意味着我们将xml转换为视图对象以便可以显示它,为此,我们需要一个名为layout inflator service的服务。并给它一个XML,它将为您转换。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.