带有膨胀的 LinearLayout 的意外 LayoutParams

2024-01-07

我有一个视图的 XML 定义,我将使用 addChild 将其添加到更大的容器视图中。它基于一个LinearLayout看起来基本上是这样的:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="52dip"
android:background="@drawable/box_bg"
android:clickable="true"
android:onClick="onTreeBoxClick"
android:orientation="horizontal" >

<ImageView android:id="@+id/box_photo"
    android:layout_width="45dip"
    android:layout_height="45dip"
        ...
/>
<RelativeLayout
    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="wrap_content"
>

(省略其余部分 - 可能不相关,因为它基本上按设计工作)

当我创建这些视图时,我发现以下行为对我来说似乎很奇怪:

  1. 在我膨胀视图之后, getLayoutParameters() 返回 null。

  2. 在我调用 addChild() 将其添加到其父级后, getLayoutParameters() 返回一个有效的对象。

  3. 检查 LayoutParameters,我发现宽度和高度都设置为 -2 (WRAP_CONTENT),这显然不是我在 XML 文件中指定的值。

  4. 当我查看随附的 ImageView 的布局参数时,它会读出指定的值。

谁能解释一下这是怎么回事?为什么我指定的身高没有被注意到?

这并没有真正影响我,因为父视图是一个自定义视图,其中我使用 MeasureSpec 等强制子视图的最终尺寸,但无论如何我想理解这一点!


您没有提供一些重要的细节。

1)在我膨胀视图之后,getLayoutParameters()返回null。

我假设你用过这个:

inflater.inflate(R.layout.content, null);

在这种情况下LayoutInflater不能(根本)正确LayoutParams对于根Linearlayout因为它不知道谁将成为它的父级(所以它可以创建正确类型的LayoutParams)。如果你想使用这个:

inflater.inflate(R.layout.content, someOtherLayout, false/true);

然后是根LinearLayout会有适当的LayoutParams因为它会看到类型someOtherLayout并创建LayoutParams从这个信息来看。如果这不是您当前所做的,您可能需要提供一段代码以获得更好的答案。

2)在我调用 addChild() 将其添加到其父级之后, getLayoutParameters() 返回一个有效的对象。

我假设你谈论的是addView()方法。这addView()方法将检查LayoutParams试图添加的视图的视图,如果那些LayoutParams are null然后它会自动分配该视图LayoutParams其返回的对象generateDefaultLayoutParams() method.

3)检查布局参数,我发现宽度和高度都设置为 -2 (WRAP_CONTENT),这显然不是我在 XML 文件中指定的。

正如我在2处所说,生成的LayoutParams都来自generateDefaultLayoutParams()方法将返回一个LayoutParams实例作为父级的设计目的。例如,一个LinearLayout有方向HORIZONTAL(默认)将返回LayoutParams宽度/高度设置为的实例WRAP_CONTENT.

4)当我查看随附的 ImageView 的布局参数时,它 读取指定值。

因为LayoutInflater照顾了这个,因为ImageView它位于布局的内部,并且有一个已知的父级,LayoutInflater可以做出适当的LayoutParams.

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

带有膨胀的 LinearLayout 的意外 LayoutParams 的相关文章

  • 如何在 Android 上为 Facebook 的应用程序制作新菜单? [复制]

    这个问题在这里已经有答案了 可能的重复 Android facebook 风格幻灯片 https stackoverflow com questions 8657894 android facebook style slide 最近 Fac
  • Phonegap(3.0.0) 相机第一次尝试不成功

    出于测试目的 我复制了在音隙相机 API http docs phonegap com en 3 0 0 cordova camera camera md html Camera我发出警报onPhotoDataSuccess测试函数何时被触
  • 在系统进程中调用方法没有合格的用户错误

    我在 android 4 4 中使用通知侦听器服务 遇到一个错误 导致我的应用程序停止获取发布的通知 这是相当随机的 但当它发生时我看到 12 31 01 40 44 080 21680 21680 W ContextImpl Callin
  • 类 X 不是抽象的,并且没有实现 android.os.Parcelable 中定义的 fun writeToParcel()

    在我的 Android 应用程序中 我想添加一个 Bundle 其中包括Place下面描述我的意图的对象 由于 Serialized 速度慢且不推荐 所以我更喜欢 Parcelable 虽然我使用 Kotlin 1 3 31 但在分割某些数
  • 在 CustomAdapters 中使用条件 if(view==null)

    我正在为 ListView 编写一个自定义适配器 它扩展了 BaseAdapter 并在此方法中 Override public View getView int position View convertView ViewGroup pa
  • android中viewpager中的多个视频播放器

    我想在 viewpager 中的不同片段上播放视频 我为每个片段使用多个媒体播放器和表面视图 当我向左或向右滑动时 我也想暂停和开始视频 滑动到下一个视频完全没有问题 但是当我滑动到上一个视频 已经在播放 时 表面视图重叠 同时 我可以毫无
  • 我的应用程序重新启动后房间数据丢失

    我的应用程序中有一个 Room 的简单实现 它有两个实体 应用程序运行时它工作正常 但应用程序重新启动后我看不到任何数据 这是我的数据库创建代码 Database entities Person class College class ve
  • Recycler查看可见项目的数量

    我正在我的应用程序中创建一个水平 RecyclerView 它必须一次在屏幕上显示 2 个图像 因此每个图像的宽度必须为屏幕的 50 目前它工作正常 但每个项目都会占用屏幕的所有宽度 这是我的代码 mRecyclerView Recycle
  • 呼叫转移

    我想将所有拨打我号码的呼叫转接至新的预定义号码 自动地 可以转接来电吗 也许至少对于 Froyo 来说是可能的 我找到了名为 Easy Call Forwarding 的应用程序 http www appstorehq com easyca
  • android,如何重命名文件?

    在我的应用程序中 我需要录制视频 在开始录制之前 我为其指定名称和目录 录制完成后 用户可以重命名其文件 我写了以下代码 但似乎不起作用 当用户输入文件名并单击按钮时 我将执行以下操作 private void setFileName St
  • VideoView中的seekTo

    我在寻找视频时遇到问题 我的应用程序应该从上次停止的位置恢复视频 所以我这样做 videoView seekTo bookmark videoView start 然而 当它播放时 我听到视频开头的声音大约 1 2 秒 只有在该视频寻找到正
  • 在没有 SurfaceView 的 Android 上获取 GPU 信息

    在Android上 有没有一种方法可以在不创建SurfaceView的情况下获取GPU信息 我不想使用 OpenGL 绘制任何内容 但我只需要获取硬件信息 例如供应商 OpenGL ES 版本 可用扩展等 抱歉 我不知道如何在 Androi
  • 在包“android”中找不到属性“roundIcon”的资源标识符

    我正在尝试编译我的项目 但出现一些错误 Android 清单 xml
  • android-security :Google Play 警告:您的应用程序包含 SQL 注入问题

    作为我们应用程序的一部分 我们使用两个 contentProvider 但两者都受到 android exported false 的保护 但我们仍然收到一封 Google Play 警告邮件 您的应用程序包含 SQL 注入问题 他们提到的
  • 膨胀类 android.support.v7.internal.widget.NativeActionModeAwareLayout 时出错

    如果您以前解决过这个问题 请有人帮助我 我正在尝试使用材料设计制作一些东西 以便应用程序可以运行到 API 10 的低版本 我的代码中没有任何错误 但我不断收到此错误 Android 日志猫 06 01 05 05 37 414 E And
  • 如何在不打开浏览器的情况下查看 Android 应用程序中的网页?

    嘿 我正在开发一个 Android 应用程序 我想连接到该应用程序内的网络 不过 我在某种程度上尝试过 WebView 但它在我的目录中显示的文件很好 但当连接到 google com 时 它显示错误 然后我添加了这个文件
  • API级别29 Intent.ACTION_GET_CONTENT从下载文件夹返回错误的ID

    我正在尝试查找从文件选择器意图返回的 URI 的完整文件路径 我从互联网下载了一张图像 该图像保存在浏览器默认下载文件夹中 问题是 DocumentsContract getDocumentId content describer 返回的
  • 在大画布上滚动

    我需要一些帮助来了解滚动绘制到 Android 画布上的项目的基础知识 假设我想创建一个时间线 其中 0 处的时间是可视化的顶部 并且随着时间的增加 时间线继续呈现在上一个点下方 如果我想在 Android 上渲染它 我知道我可以通过重写
  • Android Studio 3.0 中的 Gradle 构建错误

    您能帮我解决 Android 3 0 中的 Gradle 构建问题吗 我是 Android Studio 的新手 以下是我在 AS 3 0 中的配置 gradle gt wrapper gt gradle wrapper propertie
  • 只有创建视图层次结构的原始线程才能触摸其视图。在安卓上[重复]

    这个问题在这里已经有答案了 我只是一个初学者 所以请原谅我问一个可能愚蠢的问题 我不明白只有创建视图层次结构的原始线程才能触摸其视图的含义 请有人告诉我为什么会发生此错误以及如何解决此问题 ThankYou 这是我的班级 public cl

随机推荐