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

roo*_*era 12 java xml android view android-inflate

我想更深入地了解Android是如何工作的,我需要有人来解释视图是如何实际工作的"幕后".

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

快速示例:如果我们需要找到一个按钮,我们首先需要调用"setContentVIew()",然后在我们的按钮上调用"findViewById".然后我们可以分别使用这个按钮/视图.

我最近开始使用LayoutInflater,因为我找到了"setContentView"方法无法自拔的地方,令我惊讶的是我发现我的Android知识非常好.我甚至无法管理LayoutInflater.我很尴尬.

一天之后,我设法用LayoutInflater来扩充视图.实际上它并不是很难,我从一开始就非常接近但是有一个参数我不知道要传递什么.请看一下这段代码:(这都发生在onCreate方法的Activity上)

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");
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

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

getLayoutInflater().inflate(R.layout.activity_main, null);
Run Code Online (Sandbox Code Playgroud)

我总是传递"null"参数,当然它没有用.甚至在文档中它说这个参数是可选的!(为什么?,如果需要的话)?

我做了简单的布局.请查看它以及它与HiearchyViewer的外观:

在此输入图像描述

上图中的第二个参数是什么,为什么我们需要它?可能是连接我的布局(R.layout.activity_main),使用Android提供的View(从左到右的第一个视图 - 父视图).如果是这样,为什么Android没有自动连接这两个?!

在此输入图像描述

如果还有一些有用的东西,我需要知道有关视图我会很高兴,如果有人可以告诉我(或发布一个链接).另外如果我能获得一些如何工作的网站的链接,那将是很好的..等有用的东西.

如果有人愿意回答我的问题,请解释一下.非常感谢大家!

d3m*_*h3r 11

正如您现在已经知道的那样,Android中的每个可见组件都是View.这包括Button,SpinnerTextView,EditText等等.您对我们程序中xml文件中定义的视图的访问方式也是正确的,通过对其进行膨胀然后使用它的id来查找视图.通常的方法是使用setContentView()方法.

但是有一个非常有用的类叫做LayoutInflater可以用来"膨胀"一个布局.现在考虑ListView使用setContentView()方法在xml文件中添加了a的情况.在此ListView中,您希望项目包含a ImageView和a TextView.默认的列表项只有一个TextView.因此,您决定编写一个自定义适配器,在该适配器中,您将使用一个新的listitems.xml,其中包含TextViewImageView定义了一个.现在你不能setContentView()在这种情况下使用,因为它会在整个活动上夸大这个布局,这显然是你不想要的.所以你使用LayoutInflater在这种情况下来帮助你.您暂时使用布局夸大布局inflate()方法.第一个参数采用需要膨胀的布局文件.第二个参数是这个新膨胀布局的根.在我们的例子中,它可以设置为ListView布局实际膨胀的位置.

因此,当您使用此inflate()方法时,将View返回包含膨胀的xml内部视图的a .现在使用此返回的视图实例,您可以调用findViewById() 以获取包含的视图以将文本设置为TextView和图像源ImageView.

通常LayoutInflater情况下,您最终会使用,因为它的用例比本讨论的范围更广.


Com*_*are 9

请看这个代码

这是一个相当不寻常的用法LayoutInflater.特别是,我希望它会严重搞乱你在主要内容区域之外使用动作栏和相关的"chrome".

我总是传递"null"参数,当然它没有用

null对于双参数inflate()方法的第二个参数来说,它是一个非常合理的值.这样做意味着您将View在某个时刻自己将夸大的层次结构添加到UI中(例如,通过调用addView()所需的父级).

甚至在文档中它说这个参数是可选的!

那是因为参数是可选的.

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

这不是必需的.

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

是的PhoneWindow$DecorView.

为什么我们需要它呢?

你不需要它,你选择的getDecorView()是非典型的,至少可以说.

可能是连接我的布局(R.layout.activity_main),使用Android提供的View(从左到右的第一个视图 - 父视图).

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

如果是这样,为什么Android没有自动连接这两个?!

为什么会这样?毕竟,通过计算层次结构视图屏幕截图中的气泡可以看出,除了三个之外,还有五个总观看次数.为什么会随机选择那个,而不是其中一个?此外,对于所有Android知道,您要使用的父级尚不存在,因为您将在稍后的步骤中创建它.

因此,要么将您想要的父项作为第二个参数传递给inflate()(在这种情况下,Android会将膨胀的布局作为子项添加到该父项),要么传入null(在这种情况下,将子项添加到父项是您的工作要做你自己在某个合适的地方).

请注意,让Android 自动将子项添加到父项是以下两种主要用途的标准LayoutInflater:

  • 对于儿童AdapterView(例如,a中的行ListView)
  • 对于片段的内容(即膨胀onCreateView())