有人可以解释充气方法吗?更深入地了解安卓视图

2022-09-04 08:01:30

我想更深入地了解Android的工作原理,我需要有人来解释Views实际上是如何在“引擎盖下”工作的。

在正常过程中,我们会使用方法“setContentView(R.layout.ourlayoutfile)”在扩展活动的onCreate方法中膨胀(这是正确的单词吗?)视图。然后,我们将从该 XML 中找到视图。

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

我最近开始玩 LayoutInflater,因为我到了无法用“setContentView”方法自己动手不及的地步,令我惊讶的是,我发现我的 Android 知识非常好。我甚至无法管理布局来工作。我很尴尬。

一天后,我设法用布局来夸大视图。实际上这并不难,我从一开始就已经非常接近了,但是有一个参数我不知道该传递什么。请看这个代码:( 这一切都发生在 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);

我总是传递“null”参数,当然它不起作用。即使在文档中,它也说此参数是可选的!( 为什么 ? ,如果需要)?

我做了简单的布局。请看一下它,以及它使用HiearchyViewer的外观:

enter image description here

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

enter image description here

如果还有一些有用的信息,我需要知道关于视图,如果有人可以告诉我(或发布链接),我会非常高兴。此外,如果我能获得一些链接到一些网站的链接,那就太好了。等。有用的东西。

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


答案 1

正如您现在可能已经知道的那样,Android中的每个可见组件都是一个.这包括 、 、 和 类似的东西。关于我们访问在程序的 xml 文件中定义的视图的方式,您也是对的,方法是将其膨胀,然后使用其 id 查找视图。通常的方法是使用方法。ViewButtonSpinnerTextViewEditTextsetContentView()

但是有一个非常有用的类,可以用来“膨胀”布局。现在考虑这样一种情况,即您在 xml 文件中有一个使用方法膨胀的。在此 ListView 中,您希望项目包含 和 .默认列表项只有一个 .因此,您决定编写一个自定义适配器,您将在其中使用新的列表项.xml其中您已定义并定义了一个。现在,在这种情况下您不能使用,因为它会在整个活动上膨胀此布局,这显然是您不想要的。因此,在这种情况下,您可以使用它来帮助您。使用方法临时膨胀布局。第一个参数采用需要膨胀的布局文件。第二个参数是这种新膨胀布局的根源。在我们的例子中,它可以设置为布局实际膨胀的位置。LayoutInflaterListViewsetContentView()ImageViewTextViewTextViewTextViewImageViewsetContentView()LayoutInflaterinflate()ListView

因此,当您使用此方法时,将返回 a,其中包含膨胀的 xml 中的视图。现在,使用此返回的视图实例,您可以调用以获取包含的视图,以将文本设置为 将图像源设置为 .inflate()ViewfindViewById()TextViewImageView

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


答案 2

请看这个代码

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

我总是传递“null”参数,当然它不起作用

null是双参数方法的第二个参数的完全合理的值。这样做意味着您将在某个时候自己将膨胀的层次结构添加到UI中(例如,通过调用所需的父级)。inflate()ViewaddView()

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

这是因为该参数是可选的。

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

它不是必需的。

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

它是 .PhoneWindow$DecorView

为什么我们需要它在那里?

你不需要它在那里,至少可以说,你对它的选择是非典型的。getDecorView()

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

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

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

为什么会这样呢?毕竟,除了您夸大的三个视图之外,总共有五个视图,您可以通过计算层次结构视图屏幕截图中的气泡来判断。为什么它会随机选择那个,而不是其他的一个?此外,对于所有Android所知,您要使用的父级甚至还不存在,因为您将在后面的步骤中创建它。

因此,要么将所需的父级作为第二个参数传递给(在这种情况下,Android会将膨胀的布局作为子级添加到该父级),要么传入(在这种情况下,将子级添加到父级是您在某个合适的位置自己完成的工作)。inflate()null

请注意,让 Android 自动将孩子添加到父级是以下两个主要用途的规范:LayoutInflater

  • 对于 的子项(例如,a 中的行AdapterViewListView)
  • 对于片段的内容(即,膨胀在onCreateView())

推荐