约束布局将视图推送到设备上的屏幕外,但不推送 AVD



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

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

https://i.stack.imgur.com/hGOGs.jpg

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

https://i.stack.imgur.com/NoVdJ.jpg

我尝试将其制作成一个打包链,从 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>

在花了几个小时与之斗争并且没有找到关于为什么它无法在一个特定设备上正常工作的合理结论(物理 Note 9,我知道没有其他人有一个)当它在所有其他设备上工作正常时,物理和 AVD,我最终放弃了约束布局,而是嵌套了一个 LinearLayout。性能不佳,但按预期/需要工作。

补遗: 我找到了问题的根源。这是Note 9本身(尽管我没有在设备上的其他应用程序中看到此问题,但也许是特定的ConstraintLayout问题?我在手机上根本不使用很多应用程序..)我的Note 9处于WQHD +模式(2960x1440),当使用带有ConstraintLayout(2.0.0-beta2)的布局时,UI元素被推离屏幕时,这会导致各种奇怪的事情。切换回出厂时的FHD+(2220x1080),一切又开始工作。不确定问题是否出在三星的端(也许设备以 FQHD+ 分辨率放大,因此"屏幕"的实际边缘不在实际屏幕上(?),或者问题以某种方式出在当前版本的 ConstraintLayout 本身。

所以,作为对自己的注意。我发布的原始代码适用于除WQHD +分辨率的三星Galaxy Note 9之外的所有内容。

目前没有真正的设备,但尝试没有Space,只需将您的ConstraintLayout替换为:

<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_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" 
app:layout_constraintEnd_toStartOf="@+id/timerDisplay"/>
<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_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/scoreDisplay"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

最新更新