在 ConstraintLayout xml 中取消设置 属性

Unset a property in a ConstraintLayout xml

我有一种带有默认 ConstraintLayout 行为的风格。现在我想重置 layout_constraintTop_toTopOf 属性 以获得 layout_constraintTop_toBottomOf 的正确约束。如何从视图中删除 layout_constraintTop_toTopOf

styles.xml:

<style name="ConstraintDefault">
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_height">0dp</item>
    <item name="layout_constraintBottom_toBottomOf">parent</item>
    <item name="layout_constraintEnd_toEndOf">parent</item>
    <item name="layout_constraintStart_toStartOf">parent</item>
    <item name="layout_constraintTop_toTopOf">parent</item>
</style>

main_layout.xml:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/include_toolbar"
        layout="@layout/layout_toolbar" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvDummy"
        style="@style/ConstraintDefault"
        app:layout_constraintTop_toBottomOf="@id/include_toolbar" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        style="@style/Fab"
        app:srcCompat="@drawable/ic_add" />

</android.support.constraint.ConstraintLayout>

结果: RecyclerView 重叠 Toolbar 因为 app:layout_constraintTop_toTopOf="parent"

对于像我认为约束布局有点矫枉过正的东西,你里面只有一个 recylcer 视图,我建议你改用协调器布局。 像这样

<android.support.design.widget.CoordinatorLayout 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"
    tools:context="Your Context"
    tools:showIn="@layout/activity_main">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:scrollbars="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.design.widget.CoordinatorLayout> 

要取消约束布局 属性 必须用负数遮蔽它:

app:layout_constraintTop_toTopOf="-1"   // Upd: It's DEPRECATED! Use the method below

事实证明,将 layout 属性移动到 style.xml 并不是一个好主意。最好在那里写 style 属性(backgroundtextSizefont 等)

更新

对于较新的约束布局版本,此方法不再有效并会引发编译时错误。您应该按照@jeff-padgett 的建议使用空引用:

app:layout_constraintTop_toTopOf="@null"

unset 样式中的约束集,请使用:

app:layout_constraintTop_toTopOf="@null"