java - 有人可以解释膨胀方法吗?深入理解Android View

标签 java android xml view android-inflate

我想更深入地了解 Android 的工作原理,并且我需要有人来解释 View 在“幕后”实际上是如何工作的。

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

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

我最近开始玩 LayoutInflater,因为我到了无法帮助自己使用“setContentView”方法的地步,令我惊讶的是我发现我的 Android 知识非常糟糕。我什至无法管理 LayoutInflater 工作。我很尴尬。

一天后,我设法使用 LayoutInflater 扩充 View 。其实这并不难,我从一开始就已经很接近了但是有一个参数我不知道该传入什么。请看这段代码:(这一切都发生在 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);

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

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

enter image description here

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

enter image description here

如果有人能告诉我(或发布链接),我将非常高兴了解有关 View 的有用信息。另外,如果我能获得一些指向 View 工作原理等网站的链接,那就太好了。有用的东西。

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

最佳答案

您现在可能已经知道,Android 中的每个可见组件都是一个View。这包括 ButtonSpinnerTextViewEditText 等。您对我们访问程序中 xml 文件中定义的 View 的方式也是正确的,方法是对其进行扩充,然后使用它的 id 查找 View 。通常的方法是使用 setContentView() 方法。

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

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

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

关于java - 有人可以解释膨胀方法吗?深入理解Android View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19862456/

相关文章:

android - 当用户在 Android 上按下主页按钮时无法继续录制视频

android - 带有操作按钮的推送通知不起作用

android - 如何在全屏启动画面中去除图像周围的白色边框

java - 是否可以将 JavaScript 变量传递给 Scriptlet 内的 Java 代码

java - 读取/更新时的 Hibernate 并发(?)问题

android - 无法更改android中的自定义进度条宽度

java - Java 中的撒克逊语 : XSLT for CSV to XML

C++,RapidXML : function to get total of siblings nodes

java - 捕获 DOS(命令提示符)的输出并显示在 JAVA Frame 中

java - 我应该在 GKE 引擎上部署 api-gateway 吗?