以像素为单位定义大小

时间:2018-02-16 14:17:01

标签: android android-layout

我有一个带有自定义布局的ListView,它由左侧的图像和旁边的两个TextView组成。

由于列表项的高度不应高于图像,我考虑将高度定义为150px,这是图像的大小。

然而,这导致Android Studio向我显示警告。

在这种情况下,设置项目的高度(以像素为单位)被认为是不好的做法,如果是这样,我应该如何解决?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:adjustViewBounds="true"
    android:scaleType="centerInside"
    android:src="@mipmap/ic_launcher" />

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dp">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:textAppearanceLarge"
        tools:text="Text" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textAppearance="?android:textAppearanceMedium"
        tools:text="Text" />

</LinearLayout>

这是我要创建的布局图片:

3 个答案:

答案 0 :(得分:1)

  

设置项目的高度(以像素为单位)被视为不良练习   这个案子?

因为它会阻止Android OS根据不同的2个屏幕的可用空间调整视图的大小

  

我该如何解决?

使用dp代替px

px表示屏幕上的实际像素,因此与小密度屏幕相比,具有更高密度的设备每英寸将具有更多像素,因此在更高密度的屏幕上将以小尺寸显示视图

dp是显示独立像素,借助以下公式计算

px = dp * (dpi / 160)

一组六个广义密度:

ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi

答案 1 :(得分:1)

您需要不同的图片尺寸support different screens

例如mdpi是1,0x,hdpi - 1,5x,意思是,如果你的图片大小为mdpi 150px,你需要225px图片用于hdpi。

比ListView的大小为150dp(mdpi为1,0x)。

答案 2 :(得分:1)

从评论继续讨论,您应该修改布局以与其他视图动态协作。在99.999%的时间内使用布局中的像素是不好的做法(但不要引用我的话)。

我建议使用ConstraintLayout来平整您的层次结构,保留您案例的所有必要方面(包括您图片的1:1比例)。

以下是适合您的布局:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/image"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scaleType="fitXY"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <TextView
        android:id="@+id/title"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:textAppearance="?android:textAppearanceLarge"
        app:layout_constraintBottom_toTopOf="@+id/subtitle"
        app:layout_constraintLeft_toRightOf="@+id/image"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <TextView
        android:id="@+id/subtitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:textAppearance="?android:textAppearanceMedium"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="@+id/title"
        app:layout_constraintRight_toRightOf="@+id/title"
        app:layout_constraintTop_toBottomOf="@+id/title"/>

</android.support.constraint.ConstraintLayout>

如果您无法理解布局,请告诉我。

layout_example