首页 > 解决方案 > 约束布局在设备上将视图推送到屏幕外但不是 AVD

问题描述

我正在开发一个适用于 Android 的应用程序,并且一直在 LinearLayout 中使用约束布局来让一些 TextView 并排放置,每个都占据屏幕的一半。

下面的屏幕截图来自 AVD(像素 2,但在不同比例/DPI 的其他 AVD 上看起来相同),并且所有内容都正确居中。分数标签后面的红色背景只是为了对比。

https://i.imgur.com/SmqutpI.jpg

但是,当推送到实际设备(在本例中为三星 Note 9)时,“分数”TextView 似乎会增长,并将所有内容推到右侧,并离开屏幕。

https://imgur.com/a/sUkr8Bt

我试着让它成为一个打包的链,使用从 0.0 到 1.0 的水平偏差,将字体大小更改为非常小的字体(仅用于测试),删除空间视图,结果在设备上都是一样的。

我对 Java 并不陌生,但我对 Android 开发很陌生,所以如果这是我错过的一些简单的事情,我深表歉意(我在搜索中找不到完全相同的东西)

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="12">

        <TextView
            android:id="@+id/scoreDisplay"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="#BFCF0000"
            android:gravity="center_vertical"
            android:shadowColor="#000000"
            android:shadowDx="1"
            android:shadowDy="0"
            android:shadowRadius="3"
            android:text="@string/score"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/space1"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintHorizontal_chainStyle="packed"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Space
            android:id="@+id/space1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/timerDisplay"
            app:layout_constraintHorizontal_chainStyle="packed"
            app:layout_constraintStart_toEndOf="@id/scoreDisplay"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/timerDisplay"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:background="#BF000000"
            android:gravity="center_vertical"
            android:shadowColor="#000000"
            android:shadowDx="1"
            android:shadowDy="0"
            android:shadowRadius="3"
            android:text="@string/time_left"
            android:textColor="#FFFFFF"
            android:textSize="24sp"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_chainStyle="packed"
            app:layout_constraintStart_toEndOf="@id/space1"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

标签: androidxmlandroid-studioandroid-layout

解决方案


在花了几个小时与之抗争之后,并没有找到合理的结论来解释为什么它不能在一个特定的设备上正常工作(一个物理 Note 9,我认识的其他人都没有)当它在每个其他设备上都可以正常工作时,无论是物理的和 AVD,我最终废弃了约束布局,而是嵌套了一个线性布局。性能不佳,但按预期/需要工作。

附录:我找到了问题的根源。它与 Note 9 本身有关(虽然我在设备上的其他应用程序中没有看到这个问题,也许它是一个特定的 ConstraintLayout 问题?我的手机上根本不使用很多应用程序..)我的 Note 9 是 WQHD+模式 (2960x1440) 在使用带有 ConstraintLayout (2.0.0-beta2) 的布局且 UI 元素被推离屏幕时会导致各种奇怪的东西。切换回出厂时的 FHD+ (2220x1080),一切都重新开始工作。不确定问题是否出在三星的一端(可能设备以 FQHD+ 分辨率放大,因此“屏幕”的实际边缘不在实际屏幕上(?),或者问题出在 ConstraintLayout 本身的当前版本中。

所以,作为给自己的一个说明。我发布的原始代码适用于除 WQHD+ 分辨率的三星 Galaxy Note 9 以外的所有设备。


推荐阅读