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的主要内容,如果未能解决你的问题,请参考以下文章

如何仅指定一次 LinearLayout 元素之间的间距?

Pygame:这个 spritesheet 代码适用于另一个项目,但不适用于这个项目。为啥?

使用 jQuery 的表单验证中的问题,适用于另一个表单

Moya 请求未针对一个提供商启动,但适用于另一个提供商

无法连接到一个 VM 上的网络适配器,相同的代码适用于另一个 VM

游戏得有活动的场景:代码中多行多列的LinearLayout布局