使用 LayoutInflator 的 inflate 方法时的不同结果

2024-01-26

我想知道如何LayoutParams将致力于LayoutInflator。两者之间有什么区别:

LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, null); //FIRST WAY
LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, container,false); //SECOND WAY

因为,这两种方法给了我不同的结果。 实际上,第二个 inflate 方法为我提供了两个子布局更改的正确结果,但第一个方法会给我不同的结果。

这是我的代码:

MainActivity.Java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        LinearLayout mainLayout=(LinearLayout)findViewById(R.id.mainLayout);
        LayoutInflater inflater=LayoutInflater.from(getApplicationContext());
        for(int i=0;i<10;i++){
            LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, null); //First WAY
//          LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, mainLayout,false);  //SECOND WAY
            mainLayout.addView(childLayout);
        }
    }


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

</LinearLayout>


childitemlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:orientation="vertical" 
    android:background="#525f67">

    <TextView android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="Button"
            android:gravity="center"
            />


</LinearLayout>  <!-- Both ways gives different result  --> 


<!-- 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:background="#525f67">

    <TextView android:id="@+id/btn"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:text="Button"
            android:gravity="center"
            />


</LinearLayout> Both method gives SAME result   -->  

两者之间的主要区别inflate()方法是第二个参数(ViewGroup参数)及其在设置正确的LayoutParams对于膨胀布局文件的根视图。这很重要,因为LayoutParams保留视图的各种布局属性(如宽度、高度、定位规则等),并且是该视图的父视图可以正确显示视图所必需的。

第一种方法基本上说:从该布局文件构建层次结构视图但不分配LayoutParams到膨胀层次结构的根(可能是因为父级还不知道),也不要将膨胀视图附加到父级.

第二种充气方法说:从这个布局文件构建层次结构视图也分配适当的LayoutParams(基于赋予 inflate 方法的第二个参数)到膨胀层次结构的根,也不要将膨胀视图附加到父级.

在第一种情况下,膨胀布局文件的根(R.layout.childitemlayout)不会有任何LayoutParams设置在其上(inflate方法没有分配任何,因为第二个参数是null它不知道哪种类型LayoutParams生成),因此您的固定宽度/高度值会丢失。稍后当你会做的时候mainLayout.addView(childLayout); the mainLayout将检查LayoutParams of the childLayout,看看那些是null并会自动设置一个实例LayoutParams(使用其generateDefaultLayoutParams()方法)。该方法在水平方向的特殊情况下LinearLayout,将返回一个实例LayoutParams其中宽度/高度将设置为WRAP_CONTENT。所以你的childLayout最终会是WRAP_CONTENT作为其大小而不是您为其设置的固定值。

在第二种情况下,inflate方法看到你建议了LinearLayout mainLayout as the ViewGroup用于生成LayoutParams。这意味着从布局文件中检索的固定值(用于宽度/高度)可以存储在适当的实例中LayoutParams。当你会做的时候mainLayout.addView(childLayout);, mainLayout会看到childLayout有适当的LayoutParams实例(具有布局文件中使用的值)并且不调用它的generateDefaultLayoutParams().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LayoutInflator 的 inflate 方法时的不同结果 的相关文章

随机推荐

  • 使用命令提示符修改 cmd.exe 属性

    这不是很好的递归吗 我的外部驱动器上有一个便携式命令提示符 它有一个很好的 bat 文件来配置一些初始设置 但我想要更多 这是我知道如何从 bat 设置的内容 颜色 颜色 XY 其中 x 和 y 是预定义颜色的十六进制数字 Prompt p
  • ini_set("upload_max_filesize","200M") 在 php 中不起作用[重复]

    这个问题在这里已经有答案了 可能的重复 覆盖 upload max filesize https stackoverflow com questions 949415 overriding upload max filesize 我使用这些
  • 我需要一个循环遍历日期间隔

    我有开始日期和结束日期 我需要遍历这两个日期之间的每一天 最好的方法是什么 我只能建议这样的事情 Date currentDate new Date startDate getTime while true if currentDate g
  • xcode 无法识别类的更改

    由于某种原因 xcode 无法识别我对程序 这是一个 C 命令行程序 中的某个类所做的任何更改 例如 如果我为此类创建一个新方法并尝试在另一个文件中使用它 该文件已经包含该类的 h 文件 并且我已经在该文件中广泛使用了该类 它会给我一个错误
  • cassandra CQL 中的内连接

    如何在 cassandra 中编写子查询 嵌套查询 CQL 中是否提供了此功能 我尝试过的例子 cqlsh testdb gt select itemname from item where itemid select itemid fro
  • Docker compose找不到本地包

    因此 我在 GOlang 中创建了 REST api 和一个 grpc 服务 现在我想在 docker compose 中组合它 我的 docker compose 看起来像这样 version 3 services db image po
  • 在同一台计算机上运行 Internet Explorer 6、Internet Explorer 7 和 Internet Explorer 8

    和其他人一样 我需要在 Internet Explorer 6 和 Internet Explorer 7 上测试我的代码 现在 Internet Explorer 8 为开发人员提供了一些很棒的工具 我想使用它们 我还想开始使用 Inte
  • 在bat文件中查询npm错误状态

    我们目前正在将 UI 项目 总共 3 个 的构建转移到 Grunt 为了简化转换 我想提供一个可以运行的bat文件npm install对于每个项目 但是我想知道发出此命令时是否出现问题 我所追求的只是糖衣 我知道 npm 会回显错误 但我
  • psql: FATAL: 用户 PAM 身份验证失败

    PostgreSQL 9 2 4 我无法再使用过去工作过的用户登录 我假设配置有问题 因此 为了进行测试 我创建了一个测试用户角色 testing 其选项与相关角色相同 作为仍然可以登录的 postgres 用户 CREATE ROLE t
  • 如何在Python 2.7中实现带超时的锁

    有没有一种方法可以在Python中实现多线程锁acquire方法可以有任意超时吗 到目前为止我发现的唯一可行的解 决方案使用轮询 这 我觉得不优雅而且效率低下 不保留锁的有界等待 进度保证作为临界区问题的解决方案 有没有更好的方法来实现这个
  • IList 到 IQueryable

    我有一个列表 我想将其包装到 IQueryable 中 这可能吗 List
  • 使用 C# 进行 AES 加密 使用 crypto-js 进行解密

    我正在尝试使用 C 加密字符串并使用 Angular crypto js 库解密它 但它给了我不同的输出 我尝试了不同的 c aes 加密实现 但 crypto js 库无法解密 c 中的加密数据 感谢您的任何帮助 这是我的代码 程序 cs
  • 覆盖 DICOM 中的像素数据时应替换哪些 DICOM UID?

    我正在尝试从现有文件创建一个新的 DICOM 文件 实例 并在其中更改像素数据 我知道在替换像素数据时需要更改一些 UID 目前我正在生成SOPInstanceUID MediaStorageSOPInstanceUID and Refer
  • 将 HTML 字符串附加到 DOM

    如何附加 HTML 字符串 例如 var str p Just some span text span here p to the div 与身份证test Btw div innerHTML str 是不能接受的 Use insertAd
  • 如何将 Swagger 无配置设置与 Jersey 2 集成

    我正在尝试使用 Tomcat 8 5 上托管的 Jersey 2 项目进行准系统 Swagger 设置 我首先使用 Jersey 入门指南中的以下代码片段生成了 Jersey 项目 https jersey github io docume
  • Ajax请求问题:错误80020101

    我有一个返回 jsp 页面的请求 但事实是 jsp 中包含 jsp include 它调用其中的另一个 jsp 文件 并且 ie 给出错误 80020101 有任何想法吗 Thanks 如果您从 jQuery 进行 AJAX 调用并且在数组
  • Laravel 的多重身份验证

    我想将中间件身份验证分为两个角色 第一个角色用于管理员 第二个角色用于用户 但有些路线供所有用户和管理员使用 而少数路线仅供管理员使用 我如何与路线分开 Auth routes Route group middleware gt auth
  • 在 Oracle SQL 中计算 2 个日期/时间之间的差异

    我有一个表如下 Filename varchar Creation Date Date format dd mm yyyy hh24 mi ss Oldest cdr date Date format dd mm yyyy hh24 mi
  • 如何让 Spring-Data-MongoDB 来验证我的对象?

    我有一个非常简单的 Spring Boot 应用程序 它使用 Spring Data Mongodb 我想要做的就是设置一个 JSR 303 验证规则 规定我要保存的对象必须有用户名 我读到 JSR 303 已添加到 spring data
  • 使用 LayoutInflator 的 inflate 方法时的不同结果

    我想知道如何LayoutParams将致力于LayoutInflator 两者之间有什么区别 LinearLayout childLayout LinearLayout inflater inflate R layout childitem