0

这可能吗?

我想要以下:

  • 定义高度的 HEADER(例如 64dp)
  • 4 行均匀分布的高度(视图高度的 25% 减去标题高度 <=这是有问题的细节

我能以某种方式实现这一点ConstraintLayout吗?

问题

我想添加一个固定高度的标题,并且我希望百分比约束不根据 s 高度计算它们的百分比,而是根据减去标题后ConstraintLayout的剩余空间计算它们的百分比。ConstraintLayout

重要的提示

是的,我可以将整个包裹ConstraintLayout在 aLinearLayout中,但我对ConstraintLayout唯一基于的解决方案感兴趣。

编辑 1

为了更清楚,我想要以下内容:

h_full... full height of ConstraintLayout
h_header... full height of header

Vertical arrangement of views should look like following:
    - HEADER - y = 0
    - VIEW 1 - y = h_header
    - VIEW 2 - y = h_header + (h_full - h_header) / 4
    - VIEW 3 - y = h_header + (h_full - h_header) / 4 * 2
    - VIEW 4 - y = h_header + (h_full - h_header) / 4 * 3

Let's assume following:
   h_full = 1000
   h_header = 100
   space for views = 1000 - 100 = 900 (this is the base for the percentages!)
  h_view = 900 / 4 = 225

Then we get following:
    - HEADER - y = 0
    - VIEW 1 - y = 100
    - VIEW 2 - y = 100 + 225
    - VIEW 3 - y = 100 + 225 * 2
    - VIEW 4 - y = 100 + 225 * 3

代码

<?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_width="match_parent"
    android:layout_height="match_parent">

    <!-- Guidelines -->
    <!-- 3 horizontal guidelines -->

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_horizontal1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.25" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_horizontal2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.5" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline_horizontal3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.75" />

    <!-- Views - HEADER -->

    <View
        android:id="@+id/header"
        android:layout_width="0dp"
        android:layout_height="64dp"
        android:layout_marginLeft="@dimen/calender_cell_padding"
        android:layout_marginTop="@dimen/calender_cell_padding"
        android:layout_marginRight="@dimen/calender_cell_padding"
        android:layout_marginBottom="@dimen/calender_cell_padding"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

     <!-- Views - 4 Views, evenly distrubuted vertically -->
     
    <View
        android:id="@+id/view1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/guideline_horizontal1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/view2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/guideline_horizontal2"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/guideline_horizontal1" />

    <View
        android:id="@+id/view3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/guideline_horizontal3"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/guideline_horizontal2" />

    <View
        android:id="@+id/view4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/guideline_horizontal3" />

</androidx.constraintlayout.widget.ConstraintLayout>
4

2 回答 2

0

我通过构建我的布局找到了解决方案,LinearLayouts然后将其转换为 aConstraintLayout然后我进行了一些调整 - 它有效。

解决方案是使用没有准则的双向绑定- 这样您可以定义固定高度的标题并将下面的所有视图双向绑定,高度为0dp,这将产生标题下方的所有视图共享剩余空间的效果彼此平等。

这是我的完整布局,它是带有标题的周视图(标题具有固定大小,日单元格确实平等地使用剩余空间):

截屏

在此处输入图像描述

布局

<?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_width="match_parent"
    android:layout_height="match_parent">

    <!-- Header -->

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/mcvDetails"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/calender_cell_padding"
        android:layout_marginTop="@dimen/calender_cell_padding"
        android:layout_marginEnd="@dimen/calender_cell_padding"
        android:layout_marginBottom="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toTopOf="@+id/btFriday"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:id="@+id/llDayDetails"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tvInfos"
                android:gravity="center_horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Infos" />

        </LinearLayout>

    </com.google.android.material.card.MaterialCardView>

    <!-- Row 1 - Mon / Fri -->

    <com.michaelflisar.iron.feature.workoutlog.views.calendarview.cell.CalendarCellView
        android:id="@+id/btMonday"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_padding"
        android:layout_marginEnd="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toBottomOf="@+id/btFriday"
        app:layout_constraintEnd_toStartOf="@+id/btFriday"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/btFriday"
        app:vcc_label="@string/monday" />

    <com.michaelflisar.iron.feature.workoutlog.views.calendarview.cell.CalendarCellView
        android:id="@+id/btFriday"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_half_padding"
        android:layout_marginTop="@dimen/calender_cell_half_padding"
        android:layout_marginEnd="@dimen/calender_cell_padding"
        android:layout_marginBottom="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toTopOf="@+id/btSaturday"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btMonday"
        app:layout_constraintTop_toBottomOf="@+id/mcvDetails"
        app:vcc_label="@string/friday" />

    <!-- Row 2 - Tue / Sat -->

    <com.michaelflisar.iron.feature.workoutlog.views.calendarview.cell.CalendarCellView
        android:id="@+id/btTuesday"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_padding"
        android:layout_marginEnd="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toBottomOf="@+id/btSaturday"
        app:layout_constraintEnd_toStartOf="@+id/btSaturday"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/btSaturday"
        app:vcc_label="@string/tuesday" />

    <com.michaelflisar.iron.feature.workoutlog.views.calendarview.cell.CalendarCellView
        android:id="@+id/btSaturday"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_half_padding"
        android:layout_marginTop="@dimen/calender_cell_half_padding"
        android:layout_marginEnd="@dimen/calender_cell_padding"
        android:layout_marginBottom="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toTopOf="@+id/btSunday"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btTuesday"
        app:layout_constraintTop_toBottomOf="@+id/btFriday"
        app:vcc_label="@string/saturday" />

    <!-- Row 3 - Wen / Sun -->

    <com.michaelflisar.iron.feature.workoutlog.views.calendarview.cell.CalendarCellView
        android:id="@+id/btWednesday"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_padding"
        android:layout_marginEnd="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toBottomOf="@+id/btSunday"
        app:layout_constraintEnd_toStartOf="@+id/btSunday"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/btSunday"
        app:vcc_label="@string/wednesday" />

    <com.michaelflisar.iron.feature.workoutlog.views.calendarview.cell.CalendarCellView
        android:id="@+id/btSunday"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_half_padding"
        android:layout_marginTop="@dimen/calender_cell_half_padding"
        android:layout_marginEnd="@dimen/calender_cell_padding"
        android:layout_marginBottom="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toTopOf="@+id/btUnused"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btWednesday"
        app:layout_constraintTop_toBottomOf="@+id/btSaturday"
        app:vcc_label="@string/sunday" />

    <!-- Row 4 - Thu -->

    <com.michaelflisar.iron.feature.workoutlog.views.calendarview.cell.CalendarCellView
        android:id="@+id/btThursday"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_padding"
        android:layout_marginEnd="@dimen/calender_cell_half_padding"
        app:layout_constraintBottom_toBottomOf="@+id/btUnused"
        app:layout_constraintEnd_toStartOf="@+id/btUnused"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/btUnused"
        app:vcc_label="@string/thursday" />

    <View
        android:id="@+id/btUnused"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/calender_cell_half_padding"
        android:layout_marginTop="@dimen/calender_cell_half_padding"
        android:layout_marginEnd="@dimen/calender_cell_padding"
        android:layout_marginBottom="@dimen/calender_cell_padding"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/btThursday"
        app:layout_constraintTop_toBottomOf="@+id/btSunday" />

</androidx.constraintlayout.widget.ConstraintLayout>
于 2021-09-01T07:19:14.903 回答
0

拥有 HEADER 的解决方案:

app:layout_constraintHorizontal_bias当可用空间允许时,使用带有和/或s 的偏差app:layout_constraintVertical_bia来修改视图位置。例如:

<Button
    ...
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintHorizontal_bias="0.25"
    .../>

或者,您可以使用以下指南app:layout_constraintGuide_percent:例如:

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5"/>

具有 4 行均匀分布高度的解决方案(视图高度的 25% - 标题高度)

您可以使用 ConstraintLayout.widget.Flow 进行相同的操作。可以在此处找到相同的文档:https://developer.android.com/reference/androidx/constraintlayout/helper/widget/Flow

它可以帮助您以一种受限的方式限制所有需要的视图,它们只有一种宽度和高度:


    <androidx.constraintlayout.helper.widget.Flow
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" 
        app:constraint_referenced_ids="item_1,item_2,item_3" />

reference_ids 是您以受限方式放置所需的所有视图的地方。还可以选择使用不同的换行模式来排列视图。您可以从文档中探索包装模式。

于 2021-08-29T11:51:17.717 回答