【问题标题】:Android ImageViews in GridLayout rendering problemAndroid ImageViews in GridLayout 渲染问题
【发布时间】:2020-02-28 21:55:39
【问题描述】:

我对包含 ImageViews 的 GridLayout 有一个奇怪的问题。

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:columnCount="2"
    android:rowCount="3"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_row="1"
        android:layout_column="0"
        android:src="@drawable/test" />

    <ImageView
        android:layout_row="2"
        android:layout_column="0"
        android:src="@drawable/test" />

    <ImageView
        android:layout_row="0"
        android:layout_column="1"
        android:src="@drawable/test" />

    <ImageView
        android:layout_row="1"
        android:layout_column="1"
        android:src="@drawable/test" />

    <ImageView
        android:layout_row="2"
        android:layout_column="1"
        android:src="@drawable/test" />

</GridLayout>

这是我想要实现的目标:

但是,布局似乎根本没有缩放,看起来像这样(取决于屏幕大小):

我尝试过的(但没有成功):

  • 在 GridLayout 中添加android:clipChildren="false"
  • 将 ImageViews 的 scaleType 设置为 fitXYfitCentercenterCrop
  • 将 ImageViews 的 layout_widthlayout_height 设置为 wrap_contentmatch_parent 及其排列(但是,我希望 GridLayout 自动设置其子项的大小)

能否请更有经验的人告诉我如何实现我的目标? :D 谢谢!

PS:如果我可以使用任何其他布局来实现所需的外观,请告诉我。

【问题讨论】:

  • 如果你的图片数量是动态的,那么你应该使用 recycler-view
  • 如果图像是静态的,那么你可以只使用线性布局或约束布局等视图组
  • @Parag Pawar 这将只是一个静态布局。我尝试过嵌套的 LinearLayouts,但它看起来不太好 - 有时图像有点偏离。不过,我会尝试使用 ContraintLayout。

标签: android imageview android-gridlayout


【解决方案1】:

您需要为子视图指定layout_width / layout_heightlayout_columnWeight / layout_rowWeight。类似于 LinearLayout 中的权重。

像这样使用它:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:columnCount="2"
    android:rowCount="3"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        android:layout_row="1"
        android:layout_column="0"
        android:src="@drawable/test" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        android:layout_row="2"
        android:layout_column="0"
        android:src="@drawable/test" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        android:layout_row="0"
        android:layout_column="1"
        android:src="@drawable/test" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        android:layout_row="1"
        android:layout_column="1"
        android:src="@drawable/test" />

    <ImageView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        android:layout_row="2"
        android:layout_column="1"
        android:src="@drawable/test" />

</GridLayout>

顺便说一句,我建议您使用 JetPack (AndroidX) 中的 GridLayout,因为它修复了一些错误,并且对于不同的 Android 版本具有更好的整体实现 - https://developer.android.com/jetpack/androidx/releases/gridlayout

当使用这个 AndroidX 版本时,你只需将 layout_rowWeight / columnWeight / layout_row / layout_column 的 android:* 命名空间替换为 app:* 命名空间。

【讨论】:

  • 谢谢你,我的朋友! :D 顺便说一句:有什么解释为什么我们需要将 layout_width 和 layout_height 设置为 0dp?
  • @Firzen 我不确定。可能允许明确指定某些视图的宽度/高度(因为它将具有更高的优先级),而其他视图则使用权重。因此,他们没有添加新属性,而是重用了已经需要的 layout_width/layout_height。这与在 LinearLayout 中使用权重类似/相同。
猜你喜欢
  • 2021-10-12
  • 2016-07-06
  • 2013-08-14
  • 2016-03-31
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多