【问题标题】:Emulator preview is not same to actual device模拟器预览与实际设备不同
【发布时间】:2023-04-06 10:20:01
【问题描述】:

我做了一个简单的布局,有一个ImageView 和两个Buttons

预览中显示的布局如下:

Layout as shown in android studio preview

在运行我为 Lg3(5.5",1440x2560)创建的模拟器时,我得到了以下结果(就像我设计的一样好)

Emulator result

但是,当我实际将apk下载到真正的Lg3设备时,结果如下:

Actual result

我尝试使用 layout-normal、layout-small、layout-large,但没有任何效果。

.xml 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/White"
    tools:context=".MainActivity">

<ImageView
    android:id="@+id/main_background"
    android:layout_width="230dp"
    android:layout_height="230dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="115dp"
    android:src="@drawable/main_background" />

<Button
    android:id="@+id/Sign_In"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:layout_marginTop="160dp"
    android:layout_below="@+id/main_background"
    android:layout_centerInParent="true"
    android:background="@drawable/white_buttons"
    android:fontFamily="@font/assistant"
    android:text="Sign In"
    android:textAllCaps="false"
    android:textColor="@color/Fonts"
    android:textSize="20dp" />

<Button
    android:id="@+id/Sign_Up"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_below="@+id/Sign_In"
    android:layout_centerInParent="true"
    android:layout_marginTop="20dp"
    android:layout_marginLeft="30dp"
    android:layout_marginRight="30dp"
    android:background="@drawable/colored_buttons"
    android:fontFamily="@font/assistant"
    android:text="Sign Up"
    android:textAllCaps="false"
    android:textColor="@color/White"
    android:textSize="20dp" />

</RelativeLayout>

我想知道是不是我做错了什么会在模拟器和真实设备之间产生不相等的结果。

非常感谢

【问题讨论】:

  • 我的猜测是实际设备的屏幕密度与AVD中配置的屏幕密度不同。在您的布局方面,您的设计假定屏幕最小高度为645dp(图像为115dp 上边距和230dp 高度,160dp 上边距和60dp 高度为Sign_In 和@987654334 @ 上边距和60dp 高度为Sign_Up)。那大约是 4 英寸,并且会有很多设备的屏幕比这更小。
  • 检查我对答案的补充,希望它能教你一些东西:)

标签: android layout android-emulator android-relativelayout


【解决方案1】:

正如 CommonsWare 提到的 - 这可能是因为屏幕密度不同。

我的建议是使用ConstraintLayout 为所有屏幕尺寸开发一种布局。

来自文档:

ConstraintLayout 允许您创建具有平面视图层次结构(无嵌套视图组)的大型复杂布局。它与RelativeLayout 类似,所有视图都根据兄弟视图和父布局之间的关系进行布局,但它比RelativeLayout 更灵活,更易于与Android Studio 的布局编辑器一起使用。

下面是一个使用 ConstraintLayout 的示例,但未在视图中使用固定大小的值:

<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@null"
  tools:context=".MainActivity">


<Button
    android:id="@+id/button"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:text="Button"
    app:layout_constraintHeight_percent="0.1"
    app:layout_constraintBottom_toTopOf="@+id/button2"
    app:layout_constraintEnd_toEndOf="@+id/button2"
    app:layout_constraintStart_toStartOf="@+id/button2" />

<Button
    android:id="@+id/button2"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:text="Button"
    app:layout_constraintHeight_percent="0.1"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<ImageView
    android:id="@+id/imageView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@+id/button"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintWidth_percent="0.5"
    app:layout_constraintHeight_percent="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:srcCompat="@tools:sample/avatars[14]" />
</androidx.constraintlayout.widget.ConstraintLayout>

看起来像这样:

更多关于ConstraintLayout的信息你也可以guidelinesChains支持不同的屏幕尺寸。

【讨论】:

  • 但是当你说不同的屏幕密度时,我在 android studio 中设计了它,以获得与真实设备完全相同的密度。那不应该相等吗?
  • 正如 CommonsWare 提到的 - 您应该检查 AVD 中配置的屏幕密度。一般而言,您可以使用 ConstraintLayout 为所有屏幕尺寸制作一个灵活的布局,而不是为每个屏幕尺寸使用单一布局。
  • 但是,如果通过使用约束层来执行此操作,然后为了将图像保持在按钮上方,我仍然使用特定距离作为 100dp,我如何确保它不会在某些情况下创建太大的距离屏幕?
  • 为此,您可以对视图说 - 使用 app:layout_constraintWidth_percent="0.5"app:layout_constraintHeight_percent="0.5" 作为高度,您的屏幕宽度将是屏幕的 50%
  • 阅读文档并练习制作布局是学习如何使用这种布局的最佳方式。您会发现,随着时间的推移,您将设法在几分钟内构建复杂的 UI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2014-11-16
  • 2012-09-01
相关资源
最近更新 更多