LinearLayout 改变大小

LinearLayout changing size

我使用 LinearLayout(带有一些内容)作为 GridView 中我的单元格的视图。问题是,虽然我已经指定了布局的高度 (android:layout_height="50pt"),但有​​些单元格更大。布局是垂直的,里面的项目没有高度(0pt),但是它们有重量,里面有 2 个 TextViews 和 1 个 ImageView。我注意到导致问题的单元格内的图像有点大,但为什么视图会变大? 我将不胜感激你的帮助。

XML:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="50pt"
android:gravity="center"
android:orientation="vertical">

<ImageView
    android:id="@+id/ivHero"
    android:layout_width="match_parent"
    android:layout_height="0pt"
    android:layout_weight="4"
    android:background="@color/white"
    app:srcCompat="@drawable/avatar" />

<TextView
    android:id="@+id/tvName"
    android:layout_width="match_parent"
    android:layout_height="0pt"
    android:layout_weight="1"
    android:gravity="center"
    android:singleLine="true"
    android:text="TextView"
    android:textColor="@color/white"
    android:textSize="7pt" />

<TextView
    android:id="@+id/tvPercent"
    android:layout_width="match_parent"
    android:layout_height="0pt"
    android:layout_weight="1"
    android:gravity="center"
    android:text="20%"
    android:textColor="@color/white"
    android:textSize="7pt" />

您可以尝试在您的布局中使用 dp 而不是 pt 吗? 我用不同尺寸的 dp 和 pt 测试了它,它看起来不一样。

也看看这个

pt - 点,屏幕上常用的字体大小单位。这是一个与密度无关的单位,单个 pt 的物理尺寸在每个屏幕密度上都是相同的。一英寸有 72 pt。单个 pt 转换为的像素数因屏幕密度而异。

dp - 与密度无关的像素。这是一个与密度无关的单位,但是单个 dp 的物理尺寸在每个屏幕密度上仅大致相同。一英寸大约有 160 dp。根据设备的密度桶,应用缩放因子将 dp 转换为 160 dpi 的像素数。单个 dp 转换为的像素数取决于屏幕像素密度和设备所属的密度桶。

sp - 独立于比例的像素,专门为文本大小指定。这是一个与密度无关的单位,但是单个 sp 的物理尺寸在每个屏幕密度上仅大致相同。根据设备的密度桶以及用户的文本大小偏好,缩放因子用于将 sp 转换为 160 dpi 的像素数。转化为的像素数因屏幕密度和设备所属的密度桶而异。

有关更多详细信息,您可以查看其他 answer in Whosebug or on this github repo

  1. 在这里,您对所有三个元素都使用了 "layout_weight" 参数,并提供 "layout_height" 为 0dp。错了。
  2. 每当您使用 layout_weight 参数时,您应该提供 "layout_height = match_parent" 和 "layout_width = match_parent".
  3. 只需更改 layout_height = match_parent 和 运行 应用程序,它将正常运行。

谢谢

我发现我以错误的方式夸大了我的观点,这就是 xml 被忽略的原因。这篇文章描述了我的问题: https://possiblemobile.com/2013/05/layout-inflation-as-intended/

我是这样做的:

view = p1 ?: LayoutInflater.from(context).inflate(R.layout.ticket_grid,null)

如果根为空,只需添加根:

override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
view = p1 ?: LayoutInflater.from(context).inflate(R.layout.ticket_grid, p2, false)
}