有人可以解释膨胀的方法吗? 更深入地了解Android视图

我想深入了解Android的工作原理,我需要一个人来解释一下Views是如何“底层”工作的。

在正常的过程中,我们将使用方法“setContentView(R.layout.ourlayoutfile)”在扩展的Activity的onCreate方法中从XML中扩展(这是正确的单词? 然后,我们将从该XML中find视图

快速示例:如果我们需要find一个button,我们需要先调用“setContentVIew()”,然后在我们的button上find“findViewById”。 然后我们可以分别使用这个button/视图。

最近我开始使用LayoutInflater,因为我遇到了“setContentView”方法让我无法自拔的问题,而且我惊奇地发现我的Android知识非常好。 我甚至无法pipe理LayoutInflater的工作。 我很尴尬。

一天之后,我设法使用LayoutInflater来扩充视图。 其实这不是很难,我已经从一开始就非常接近,但有一个参数,我不知道通过什么。请看这个代码:(这一切都发生在Activity的onCreate方法)

View v = getLayoutInflater().inflate(R.layout.activity_main, (ViewGroup) getWindow().getDecorView()); final Button b = (Button) v.findViewById(R.id.button1); final TextView tv = (TextView) v.findViewById(R.id.textView1); b.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tv.setText("Just random text"); } }); } 

这段代码工作正常,但我遇到的问题实际上是这行代码:

 getLayoutInflater().inflate(R.layout.activity_main, null); 

我总是通过“空”参数,当然它没有奏效。 即使在文档中,它说这个参数是可选的! (为什么?如果需要的话)?

我做了简单的布局。 请看看它和HiearchyViewer的外观:

在这里输入图像说明

上图中的第二个参数是什么,为什么我们在那里需要它? 也许连接我的布局(R.layout.activity_main),由Android提供的视图(从左到右的第一个视图 – 父视图)。 如果是这样的话,为什么不自动连接这两个自动?!

在这里输入图像说明

如果还有一些有用的东西我需要知道关于意见我会很高兴,如果有人能告诉我(或张贴链接)。 另外会很好,如果我可以得到一些链接到一些网站的视图如何工作..等有用的东西。

如果有人会降低我的问题,请解释。 非常感谢大家!

现在您可能已经知道,Android中的每个可见组件都是一个View 。 包括ButtonSpinnerTextViewEditText等等。 对于我们访问在我们的程序中的xml文件中定义的视图的方式,通过夸大它然后使用它的idfind视图也是正确的。 通常的做法是使用setContentView()方法。

但是有一个名为LayoutInflater非常有用的类可以用来“膨胀”一个布局。 现在考虑在xml文件中使用setContentView()方法膨胀的ListView的场景。 在这个ListView中,您希望项目包含一个ImageView和一个TextView 。 默认的列表项只有一个TextView 。 所以你决定写一个自定义的适配器,在这个适配器中你将使用一个新的listitems.xml文件,在这个文件夹中你定义了一个TextViewImageView 。 现在你不能在这种情况下使用setContentView() ,因为它会在整个活动中夸大这个布局,显然你不需要。 所以你在这种情况下使用LayoutInflater来帮助你。 您使用inflate()方法临时膨胀布局。 第一个参数是需要膨胀的布局文件。 第二个参数是这个新膨胀的布局的根源。 在我们的情况下,它可以被设置为布局将实际充气的ListView

所以当你使用这个inflate()方法时,返回一个包含在膨胀的xml中的视图的View 。 现在,使用这个返回的视图实例,您可以调用findViewById()来获取包含的视图,以将文本设置为TextView并将图像源设置为ImageView

通常情况下,最终会使用LayoutInflater因为它的用例比本讨论的范围要宽。

请看这个代码

这是一个相当不寻常的使用LayoutInflater 。 特别是,我希望它会严重干扰您在主要内容区域之外使用动作栏和相关的“铬”。

我总是通过“空”参数,当然它没有奏效

对于双参数inflate()方法的第二个参数, null是一个完全合理的值。 这样做意味着你会在某个时候(例如,通过调用addView()在所需的父级上)将充气的View层次结构添加到你的UI中。

即使在文档中,它说这个参数是可选的!

那是因为参数是可选的。

(为什么?如果需要的话)?

这是不需要的。

上图中的第二个参数是什么?

这是PhoneWindow$DecorView

为什么我们需要在那里?

你不需要它,而你select的getDecorView()是非典型的,至less可以说。

也许连接我的布局(R.layout.activity_main),由Android提供的视图(从左到右的第一个视图 – 父视图)。

是。 引用文档时 ,双参数inflate()的第二个参数是“可选视图是生成的层次结构的父级”。

如果是这样的话,为什么不自动连接这两个自动?!

为什么呢? 毕竟,除了你膨胀的三个以外,总共有五个视图,你可以通过计算你的Hierarchy View截图中的气泡来判断。 为什么要随机select那一个,而不是其中一个呢? 此外,对于所有的Android知道,你想要使用的父母还不存在,因为你将在后面的步骤中创build它。

因此,要么传入你想要的父母作为inflate()的第二个参数(在这种情况下,Android会将充气的布局作为子元素添加到父元素中),或者传入null (在这种情况下,将子元素添加到父元素你的工作在某个合适的地方做你自己)。

请注意,让Android 不会自动将子项添加到父项是LayoutInflater的两个主要用途的LayoutInflater

  • 对于AdapterView (例如, ListView行)
  • 为片段的内容(即在onCreateView()膨胀)