gpt4 book ai didi

android - 在 ConstraintLayout 中使用

转载 作者:IT老高 更新时间:2023-10-28 22:09:40 30 4
gpt4 key购买 nike

我在使用标签时遇到问题 <include><merge>在 ConstraintLayout 中。

我想创建一个平面 View 层次结构(因此是约束),但仍有可重用的元素。所以我用<include>在我的布局和<merge>在包含的布局中避免嵌套布局(尤其是避免嵌套的 ConstraintLayouts)

所以我写了这个:父布局

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

<include
android:id="@+id/review_1"
layout="@layout/view_movie_note"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/review_2"/>

<include
layout="@layout/view_movie_note"
android:id="@+id/review_2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="7dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/review_1"
app:layout_constraintRight_toRightOf="parent"
/>

</android.support.constraint.ConstraintLayout>

还有这个view_movie_note:

<merge>

<TextView
android:id="@+id/note_origin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:layout_marginStart="5dp"
app:layout_constraintStart_toStartOf="@+id/cardView2"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="5dp" />


<android.support.v7.widget.CardView
android:id="@+id/five_star_view_container"
android:layout_width="0dp"
android:layout_height="52dp"
android:layout_marginBottom="8dp"
android:layout_marginTop="10dp"
android:elevation="3dp"
app:cardUseCompatPadding="true"
app:contentPaddingTop="22dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHeight_min="52dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/note_origin">

<FiveStarsView
android:id="@+id/five_star_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />

</android.support.v7.widget.CardView>

<android.support.v7.widget.CardView
android:id="@+id/cardView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:cardBackgroundColor="@color/colorPrimary"
app:contentPaddingLeft="15dp"
app:contentPaddingRight="15dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/note_origin">

<TextView
android:id="@+id/grade"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp" />

</android.support.v7.widget.CardView>


</merge>

我期待这个

I am expecting this

我得到了这个

Instead I get this

很明显,我在 <include> 中提出的限制条件标签被包含的布局中的约束覆盖。

这是预期的行为吗?如果是,我们应该如何使用 <include> 保持平面布局?和约束布局?

最佳答案

简答

最好的办法是替换 <merge>带有(嵌套)ConstraintLayout 的 block 而不是使用冗余的布局结构。




ConstraintLayout is great but it doesn't work well with composition and separation of responsibilities of each piece

这是错误的。 ConstraintLayout确实可以很好地重用布局。 根据兄弟 View 和父布局之间的关系布置所有 subview 的任何布局,其行为与此完全相同。即使对于 RelativeLayout 也是如此.


那么,问题出在哪里?

让我们仔细看看 <merge> 是。

医生说

The <merge/> tag helps eliminate redundant view groups in your view hierarchy when including one layout within another.

它将与替换 <include> 具有相同的效果内容为 <merge> 的元素堵塞。换句话说,<merge/> 中的 View block 直接放置到父布局中,无需中间 View 组。因此,<include> 的约束元素被完全忽略。

在这个特定的示例中,包含布局中的 View 作为第二个在另一个之上添加到父级。


结论

布局资源文件旨在独立使用。为了限定可重用术语,它不应该依赖于它的父级(将来将添加到其中的 View 组)。如果您只需要包含一次布局,那看起来还不错。但是</merge>在这种情况下也不是一个好主意,因为您不能将它放置在任何不同的布局中的不同位置。

显然,平面布局层次结构具有更好的性能。但是,有时我们可能不得不牺牲它。

关于android - 在 ConstraintLayout 中使用 <include> 和 <merge>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46447621/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com