我最近通过一个android项目将其转换为androidx,并且在尝试阻止页面上的视图出现问题。我的布局如下,其中包含Card View和Text View的Constraint Layout。在此卡片视图中,我有一个包含文本视图的约束布局。在“卡片视图”之外,我有一个受“卡片视图”约束的按钮。
问题是,当我运行程序时,“卡片视图”将从屏幕上移开,并且即使按钮受到适当限制,按钮也会一直移动到顶部。
我将在下面显示用于实现此目的的代码以及在模拟器上的结果图像。
这是编辑器[1]中的布局:https://imgur.com/a/0FLa1IK
这是模拟器[2]上显示的布局:https://imgur.com/a/SsvKiOG
任何帮助将不胜感激。
<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">
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/materialButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="Text View Test"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<Button
android:id="@+id/materialButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="256dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
答案 0 :(得分:2)
由于此行,您的布局被推送:
android:layout_marginBottom="256dp"
不同的手机具有不同的屏幕尺寸,在您的布局中,您使用的是固定尺寸的视图(“ 256dp”),这会使您的布局无响应。
因此,在预览中看起来不错的东西在真实手机上可能看起来并不一样。
如果您想在屏幕上的任何位置放置一些视图并使其保持响应状态,我建议使用guidelines,如下所示:
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.cardview.widget.CardView
android:id="@+id/cv_text"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="8dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/materialButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Text View Test"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.cardview.widget.CardView>
<Button
android:id="@+id/materialButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/guideline13"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline13"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent=".5" />
</androidx.constraintlayout.widget.ConstraintLayout>
它看起来像这样:
答案 1 :(得分:1)
我不太确定android x,但是约束布局用于删除嵌套布局,因此,您不应在卡视图内使用约束布局。尝试将此代码作为参考。可能有帮助。
SIG_IGN
答案 2 :(得分:0)
请从button属性中删除此行:
android:layout_marginBottom="256dp"
您只是通过设置margin_bottom
来将按钮推到顶部,以及为什么只是由于屏幕大小不同而将其显示在预览中而不是显示在设备上