LinearLayout 适用于另一个 LinearLayout
Posted
技术标签:
【中文标题】LinearLayout 适用于另一个 LinearLayout【英文标题】:LinearLayout suitable to another LinearLayout 【发布时间】:2021-05-26 15:48:54 【问题描述】:constrainLayout
内部有两个线性布局,
底部的线性布局包括按钮,其高度为wrap_content
,必须是换行,因为有时我只保留 1 个按钮,有时保留 2 个按钮。
我想将顶部线性布局的高度设置为最大值,但不覆盖第二个布局。 所以我决定将 match_parent 设置为第一个,但之后它覆盖了第二个布局。
我不能使用 weight/weightsum
<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=".MainActivity">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_
android:layout_
android:orientation="vertical"
android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/button"
android:layout_
android:layout_
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_
android:layout_
android:text="Button2"
android:visibility="gone" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
【问题讨论】:
将第一个线性布局的高度设为0dp
,这是匹配约束
使用ConstraintLayout
的整个想法是为了更快地渲染视图层次结构。在您的情况下,您正在使用它,但仍将视图嵌套在 LinearLayout
中。想要的结果是什么?
【参考方案1】:
<?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=".MainActivity">
<LinearLayout
android:layout_
android:layout_
android:weightSum="11"
android:orientation="vertical">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:layout_weight="9"
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_
android:layout_
android:orientation="vertical"
android:layout_weight="1"
android:padding="16dp"
android:weightSum="2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/button"
android:layout_
android:layout_weight="1"
android:layout_
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_
android:layout_
android:layout_weight="1"
android:text="Button2"
" />
</LinearLayout>
试试这个添加的重量总和和重量以按比例进行布局
【讨论】:
考虑解释一下你做了什么改变或做了什么,否则 OP 很难了解他们做错了什么 我不能使用重量,因为这个解决方案对按钮容器施加了 1/10 的大小 wellweight 用于此特定场景,但您可以将所有内容放在相对布局中,然后可以相对定位【参考方案2】:由于您使用的是ConstraintLayout,您可以将第一个LinearLayout的高度设置为0dp。 ConstraintLayout 将其解释为“匹配约束”。 下一步是正确定义第一个 LinearLayout 的约束(您已经这样做了)。
您可以阅读有关 ConstraintLayout 的更多信息here。
<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=".MainActivity">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_
android:layout_
android:orientation="vertical"
android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/button"
android:layout_
android:layout_
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_
android:layout_
android:text="Button2"
android:visibility="gone" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
【讨论】:
【参考方案3】:为此,您必须使用 linearlayout 作为父级和属性 layoutWeight 的组合,如果您对顶部布局和按钮的容器都使用 layoutWeight 的常量值,那么这将在不同的屏幕高度设备上导致一些问题,而不是此解决方案使您能够通过将其容器的高度设置为 wrapContent 并为布局内容提供所有顶部区域来将按钮高度设置为足够大。 您还可以使顶部的 linearLayout 可滚动以获得最佳体验:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_
android:layout_
android:orientation="vertical">
<LinearLayout
android:id="@+id/this_layout_will_fil_all_space_except_the_bottom_layout_space"
android:layout_
android:layout_
android:orientation="vertical"
android:background="#000000"
android:layout_weight="1">
</LinearLayout>
<LinearLayout
android:id="@+id/button_layout_at_bottom"
android:layout_
android:layout_
android:orientation="horizontal"
android:gravity="center_horizontal"
android:padding="10dp">
<Button
android:id="@+id/button"
android:layout_
android:layout_
android:text="Button1"
android:layout_marginEnd="50dp"/>
<Button
android:id="@+id/button2"
android:layout_
android:layout_
android:text="Button2"
android:visibility="visible" />
</LinearLayout>
</LinearLayout>
对于按钮,你可以设置它的宽度为 wrapContent 并添加重力属性到它的父级,这样即使一个按钮消失了,另一个也可以完美地放在容器的中心。
享受吧!
【讨论】:
【参考方案4】:使用ConstraintLayout
的主要优点是避免使用任何其他嵌套的ViewGroups
,在布局中添加的层次越多,性能就越差。您可以check documentation了解更多信息。
因此,为了提高性能,最好直接在 ConstraintLayout
中添加小部件/视图。
所以,这里我删除了底部LinearLayout
,只保留了直接在ConstraintLayout
内的按钮,你可以对顶部LinearLayout
做同样的事情,你可以直接将任何底层视图添加到@987654328 @
<?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=".MainActivity">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</LinearLayout>
<Button
android:id="@+id/button"
android:layout_
android:layout_
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="Button1"
app:layout_constraintBottom_toTopOf="@id/button2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button2"
android:layout_
android:layout_
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="Button2"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
【讨论】:
我们无法移除线性布局,我必须在约束内使用滚动视图以上是关于LinearLayout 适用于另一个 LinearLayout的主要内容,如果未能解决你的问题,请参考以下文章
Pygame:这个 spritesheet 代码适用于另一个项目,但不适用于这个项目。为啥?