【问题标题】:Dp unit does not scale layouts in different screensDp 单位不缩放不同屏幕中的布局
【发布时间】:2020-04-26 22:27:32
【问题描述】:

阅读本文 (http://developer.android.com/guide/practices/screens_support.html) 后,我使用 xml 文件中的 dp 单元开发了一个完整的应用程序。但是,当我在不同的屏幕上测试应用程序时,布局要么太大要么太小。

我认为 dp 单元会为我解决这个问题。为什么没有呢?我不想使用 weight 属性,因为一切都已经完成了。

一个xml布局:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="140dp"
    android:src="@drawable/logo3"
    android:scaleType="centerCrop"

    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/select_level"
    android:textColor="#4cb122"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:textSize="20dp"
    android:layout_marginTop="20dp"
    />

<Button
    android:background="@drawable/red_button"
    android:layout_width="200dp"
    android:layout_height="55dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="25dp"
    android:text="@string/easy"
    android:textSize="15dp"
    android:onClick="playEasy"
    style="custom_button"
    />

<Button
    android:background="@drawable/green_button"
    android:layout_width="200dp"
    android:layout_height="55dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="10dp"
    android:text="@string/medium"
    android:textSize="15dp"
    android:onClick="playMedium"
    style="custom_button"
    />

<Button
    android:background="@drawable/blue_button"
    android:layout_width="200dp"
    android:layout_height="55dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="10dp"
    android:textSize="15dp"
    android:text="@string/unbeatable"
    android:onClick="playUnbeatable"
    style="custom_button"
    />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:layout_marginTop="113dp"
    android:textSize="15dp"
    android:textColor="@color/secondTextColor"
    android:text="@string/developed_by"
    />

我能做什么?谢谢!

【问题讨论】:

  • 请提供minimal, complete, and verifiable example 证明您的问题。在这种情况下,它将包括布局文件、维度资源文件(如果您正在使用这些文件)和显示结果的屏幕截图。
  • 1.您应该提供(其中一个)有问题的布局,也许还应该提供您的问题的屏幕截图。 2. dp 用于确保不同屏幕上的尺寸相同,它不会“缩放”布局本身。
  • 它确保相同的大小?所以这不是我需要的!如何编写将自动缩放的代码?
  • 我只使用一张图片,所以我认为我不需要将多张图片作为可绘制资源。如何缩放简单的 TextView 和 Button?
  • 您应该使用 'sp' 而不是 'dp' 作为文本大小。阅读 - stackoverflow.com/questions/11638691/…

标签: android xml


【解决方案1】:

将 dp 用于尺寸并不是真正适合此问题的所有解决方案。

请注意,您应该尽可能使用布局粗细,并且通常一个 dp 值应该适用于所有屏幕尺寸。但是,有时您会遇到导致问题的边缘情况,您只需要做一些事情以使其正常工作(例如,我必须使用这种技术在 TabLayout 中的选项卡上正确定位所有屏幕尺寸的徽章)。

我要做的就是为每个支持的屏幕尺寸放置一个dimens.xml 文件:

  • res/values-small/dimens.xml

  • res/values-normal/dimens.xml

  • res/values-large/dimens.xml

  • res/values-xlarge/dimens.xml

如果需要,您也可以使用其他限定符来定位平板电脑,see here for a guide to configuration qualifier names

然后,为每个文件中的每个屏幕尺寸限定符指定每个尺寸(请注意,这只需要对在非常大或非常小的屏幕上导致问题的尺寸值执行此操作)。

例如在 res/values-large/dimens.xml 你可能有这个:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <dimen name="image_view_height">140dp</dimen>

</resources>

然后在 res/values-small/dimens.xml 中,您可能会使用它来使其适合较小的屏幕:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <dimen name="image_view_height">96dp</dimen>

</resources>

然后,在您的布局中,使用@dimen/your_dimens_id 引用它,框架会根据设备的屏幕尺寸选择正确的:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="@dimen/image_view_height"
    android:src="@drawable/logo3"
    android:scaleType="centerCrop"

    />

【讨论】:

  • 确实有效!所以,鉴于我需要再次做所有事情,你认为最好按照你刚才所说的去做还是使用重量属性?谢谢!
  • @JoãoMarcos 我会说使用 weight 属性,你可以摆脱它并使其轻松工作,并在绝对必须使用 dp 时使用上述方法。
  • 这似乎是错误的。 dp 单位的全部意义在于您关心屏幕密度,那么为什么要根据屏幕密度限定符制作替代尺寸呢?为屏幕 size 限定符设置不同的尺寸更有意义(例如-sw600)。平板电脑往往具有较大的屏幕 size 但较小的屏幕 密度,所以我会使用 dp 单位,但可能会在平板电脑上出现时指定更大的尺寸屏幕。
  • 这是一个很好的观点。我想这是一种“快速而肮脏”的方式,你说得对,为不同的密度指定不同的 dp 是没有意义的。它确实为我克服了这个问题,即使它是一个丑陋的解决方案!另外我认为你是对的,定义屏幕尺寸限定符会更有意义,只是编辑了答案。
  • 我尝试使用权重属性,但它不起作用,因为 Android 无法识别嵌套布局中的权重。但这正是我需要的:嵌套布局。这似乎是每个开发人员都必须克服的关键问题:针对不同屏幕进行缩放。为什么我找不到有效的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多