如何在不使用 ConstraintLayout 中的边距属性的情况下相对于屏幕宽度设置 2 个视图之间的空间

Posted

技术标签:

【中文标题】如何在不使用 ConstraintLayout 中的边距属性的情况下相对于屏幕宽度设置 2 个视图之间的空间【英文标题】:How to set space between 2 views relative to screen width without using margin property in ConstraintLayout 【发布时间】:2021-11-27 04:47:23 【问题描述】:

我试图像这样在两个视图(水平和垂直)之间设置一个空间

<?xml version="1.0" encoding="utf-8"?>
<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_
    android:layout_
    tools:context=".Fragments.SetProfileFragment">

    <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:layout_marginStart="4dp"
        android:layout_marginTop="4dp"
        android:text="Test 1"
        android:textSize="20sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_
        android:layout_
        android:layout_marginStart="12dp"
        android:layout_marginTop="4dp"
        android:text="Test 2"
        android:textSize="20sp"
        app:layout_constraintStart_toEndOf="@id/textView1"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

但我希望两个TextViews 之间的空间占屏幕的 1%。有可能吗?

【问题讨论】:

为此,您可以在运行时添加边距...就像您可以在运行时找出屏幕宽度和高度并将 1% 的边距添加到视图中一样 所以我必须以编程方式设置边距? 是的............ 非常感谢,但它有点复杂,我想要响应式布局,如果我按边距硬编码空间,可以吗? 您也可以使用填充代替边距...请检查我添加的以下代码.. 【参考方案1】:

但我想将两个 TextView 隔开 1% 的屏幕。有可能吗?

为父级设置起始和顶部约束:使用Horizontal & Vertical Guidelines 和根ConstraintLayout 的百分比:

1% 被认为是 0.01,因为 1% 等于全屏宽度 >> 所以,使用app:layout_constraintGuide_percent="0.01"

您可以将约束应用到textview1,为了不再重复,您可以将textView2 约束到textview1 的BaseLine。

用于在 TextView 之间设置 1% 的屏幕宽度: 使用限制到 textView1 末尾的空间,其百分比为屏幕宽度的 1%:app:layout_constraintWidth_percent="0.01"。然后将textView2 约束到空间,而不是textView

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_
    android:layout_
    tools:context=".Fragments.SetProfileFragment">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_
        android:layout_
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.01" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline2"
        android:layout_
        android:layout_
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.01" />

    <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:text="Test 1"
        android:textSize="20sp"
        app:layout_constraintStart_toStartOf="@id/guideline"
        app:layout_constraintTop_toTopOf="@id/guideline2" />

    <Space
        android:id="@+id/space"
        android:layout_
        android:layout_
        app:layout_constraintStart_toEndOf="@id/textView1"
        app:layout_constraintWidth_percent="0.01" />

    <TextView
        android:id="@+id/textView2"
        android:layout_
        android:layout_
        android:text="Test 2"
        android:textSize="20sp"
        app:layout_constraintBaseline_toBaselineOf="@id/textView1"
        app:layout_constraintStart_toEndOf="@id/space"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

【讨论】:

【参考方案2】:

你可以试试这个代码

    val displayMetrics = DisplayMetrics()
    windowManager.defaultDisplay.getMetrics(displayMetrics)

    val width = displayMetrics.widthPixels
    val height = displayMetrics.heightPixels
    val widthPer = (1*100)/width  //1% percentage width
    val heightPer = (1*100)/height //1% percentage height
    textView1.setPadding(widthPer, heightPer, widthPer, heightPer)  //Adding padding
    textView2.setPadding(widthPer, heightPer, widthPer, heightPer) //Adding padding

【讨论】:

以上是关于如何在不使用 ConstraintLayout 中的边距属性的情况下相对于屏幕宽度设置 2 个视图之间的空间的主要内容,如果未能解决你的问题,请参考以下文章

ConstraintLayout-约束布局杂记

ConstraintLayout中Chains和Guideline的使用

如何使 ConstraintLayout 中的元素居中

在 ConstraintLayout 中滚动 RecyclerView 时如何折叠工具栏?

Android:如何使用 ConstraintLayout 在另一个小部件上显示一个小部件?

如何在motionlayout android中将Constraintlayout填充为轮播适配器中的视图?