PercentRelativeLayout 在 v26 中被弃用

PercentRelativeLayout is deprecated in v26

我想显示一个布局,其中包含 6 个视图,我按宽度和高度百分比进行设置。 但是 PercentageLayout 在 Android v26 中被弃用了 PercentageLayout 的替代方案是什么? Android 文档说要将 ConstraintLayoutapp:layout_constraintGuide_percent 一起使用。 (https://developer.android.com/reference/android/support/percent/PercentRelativeLayout.html) 但是对于 PercentageLayout 我们可以使用

 app:layout_heightPercent="33.4%"
    app:layout_widthPercent="45%"

What is the alternative for PercentageLayout

使用 ConstraintLayout,如您的问题所示。

ConstraintLayout (1.0.2) 的当前生产版本中,在所需的百分比位置设置一个准则,并将您的小部件约束到该准则。

对于即将推出的 1.1.x 系列(现在是 1.1.0-beta4),您可以在将大小设置为 [=17] 的任何轴上使用 layout_constraintWidth_percentlayout_constraintHeight_percent =] (a.k.a., MATCH_CONSTRAINT).

有两种方法可以使用 ConstraintLayout 实现布局。

#1 指南

考虑到您需要布置六个视图,您需要添加两个垂直参考线,父级的百分比位置为 33%66%宽度。并且您还需要添加两个水平参考线,屏幕高度的百分比位置为 45%90%。然后将您的六个视图限制在这些准则中,如屏幕截图所示:

这里是 XML 布局构建指南的源代码:

<android.support.constraint.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">

    <View
        android:id="@+id/view1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_bright"
        app:layout_constraintBottom_toTopOf="@+id/horizontal_guideline_1"
        app:layout_constraintEnd_toStartOf="@+id/vertical_guideline_1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/view2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_green_dark"
        app:layout_constraintBottom_toTopOf="@+id/horizontal_guideline_1"
        app:layout_constraintEnd_toStartOf="@+id/vertical_guideline_2"
        app:layout_constraintStart_toStartOf="@+id/vertical_guideline_1"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/view3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_purple"
        app:layout_constraintBottom_toTopOf="@+id/horizontal_guideline_1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/vertical_guideline_2"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/view4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_orange_light"
        app:layout_constraintBottom_toTopOf="@+id/horizontal_guideline_2"
        app:layout_constraintEnd_toStartOf="@+id/vertical_guideline_1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/horizontal_guideline_1" />

    <View
        android:id="@+id/view5"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_red_light"
        app:layout_constraintBottom_toTopOf="@+id/horizontal_guideline_2"
        app:layout_constraintEnd_toStartOf="@+id/vertical_guideline_2"
        app:layout_constraintStart_toStartOf="@+id/vertical_guideline_1"
        app:layout_constraintTop_toTopOf="@+id/horizontal_guideline_1" />

    <View
        android:id="@+id/view6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_dark"
        app:layout_constraintBottom_toTopOf="@+id/horizontal_guideline_2"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/vertical_guideline_2"
        app:layout_constraintTop_toTopOf="@+id/horizontal_guideline_1" />

    <android.support.constraint.Guideline
        android:id="@+id/vertical_guideline_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.33" />

    <android.support.constraint.Guideline
        android:id="@+id/vertical_guideline_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.66" />

    <android.support.constraint.Guideline
        android:id="@+id/horizontal_guideline_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.45" />

    <android.support.constraint.Guideline
        android:id="@+id/horizontal_guideline_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.9" />

</android.support.constraint.ConstraintLayout>

#2 有重量的链条

Chains 是另一种使用百分比值调整视图大小的强大方法。您在 ConstraintLayout 链中使用权重值就像在 LinearLayout 中使用权重一样。

这里的 XML 示例展示了如何使用带权重的链:

<android.support.constraint.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">

    <View
        android:id="@+id/view1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_bright"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintHorizontal_weight="33.3"
        app:layout_constraintVertical_chainStyle="spread"
        app:layout_constraintVertical_weight="45"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/view2"
        app:layout_constraintBottom_toTopOf="@+id/view4" />

    <View
        android:id="@+id/view2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_green_dark"
        app:layout_constraintHorizontal_weight="33.3"
        app:layout_constraintTop_toTopOf="@+id/view1"
        app:layout_constraintStart_toEndOf="@+id/view1"
        app:layout_constraintEnd_toStartOf="@+id/view3"
        app:layout_constraintBottom_toBottomOf="@+id/view1" />

    <View
        android:id="@+id/view3"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_purple"
        app:layout_constraintHorizontal_weight="33.3"
        app:layout_constraintTop_toTopOf="@+id/view2"
        app:layout_constraintStart_toEndOf="@+id/view2"
        app:layout_constraintBottom_toBottomOf="@+id/view2"
        app:layout_constraintEnd_toEndOf="parent" />

    <View
        android:id="@+id/view4"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_orange_light"
        app:layout_constraintHorizontal_chainStyle="spread"
        app:layout_constraintHorizontal_weight="33.3"
        app:layout_constraintVertical_weight="45"
        app:layout_constraintTop_toBottomOf="@+id/view1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/view5"
        app:layout_constraintBottom_toTopOf="@+id/space" />

    <View
        android:id="@+id/view5"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_red_light"
        app:layout_constraintHorizontal_weight="33.3"
        app:layout_constraintTop_toTopOf="@+id/view4"
        app:layout_constraintStart_toEndOf="@+id/view4"
        app:layout_constraintEnd_toStartOf="@+id/view6"
        app:layout_constraintBottom_toBottomOf="@+id/view4" />

    <View
        android:id="@+id/view6"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_dark"
        app:layout_constraintHorizontal_weight="33.3"
        app:layout_constraintTop_toTopOf="@+id/view5"
        app:layout_constraintStart_toEndOf="@+id/view5"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="@+id/view5" />

    <Space
        android:id="@+id/space"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintVertical_weight="10"
        app:layout_constraintTop_toBottomOf="@+id/view4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

</android.support.constraint.ConstraintLayout>

上面显示的两个例子都导致了这个结果:

阅读更多关于: