【问题标题】:Vertically center TextView inside layout in android and also keep layout scrollable在 android 的布局内垂直居中 TextView 并保持布局可滚动
【发布时间】:2021-12-10 18:13:55
【问题描述】:

我想在下面的布局中垂直居中 TextView id text_no_items 并保持布局可滚动以防 TextView id 描述很长,我们需要滚动才能看到完整的内容。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="This is a sample description about the items you will see below. This text could be very long."
        android:textSize="32sp" />

    <TextView
        android:id="@+id/text_no_items"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="No items"
        android:textSize="48sp" />

</LinearLayout>

如果我们将父布局(LinearLayout)的高度设置为match_parent并给出如下布局权重,TextView是垂直居中的。但在这种情况下,布局是不可滚动的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/description"
        android:layout_weight="0"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="This is a sample description about the items you will see below. This text could be very long."
        android:textSize="32sp" />

    <TextView
        android:id="@+id/text_no_items"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="No items"
        android:textSize="48sp" />

</LinearLayout>

欢迎提出使用其他布局的建议。


更新:添加参考图像。抱歉画质不好

【问题讨论】:

  • 能否请您附上正在发生的事情的图片,并提供更多信息。谢谢,只是为了让我确切地知道发生了什么,所以我们知道我们必须解决什么问题。
  • @TomasMota 我已添加图片供参考
  • 你的意思是在描述textView下方的可用空间中垂直居中吗?
  • @Zain 是的,在可用空间中。
  • @MohitYadav 感谢您的澄清,我发布了答案;请看一看;希望它对你有用。

标签: android android-layout android-linearlayout


【解决方案1】:

使用ConstraintLayout 并将描述TextView 放入NestedScrollView 中,如下例所示。

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:gravity="center"
            android:text="@string/sample_text"
            android:textSize="32sp" />

    </androidx.core.widget.NestedScrollView>

    <TextView
        android:id="@+id/text_no_items"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="No items"
        android:textSize="48sp"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

更新

使用ScrollView 作为根布局

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/sample_text"
            android:textSize="32sp"
            app:layout_constraintBottom_toTopOf="@id/text_no_items"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/text_no_items"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="No items"
            android:textSize="48sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/description" />

    </androidx.constraintlayout.widget.ConstraintLayout>


</ScrollView>

这是description TextView 的content

【讨论】:

  • 它将“无项目”文本垂直居中在整个屏幕上,而不是在描述文本下方的可用空间中居中,如附图所示。此外,当用作 Preference 布局时,由于某种原因,此布局不可滚动。
  • 在更新版本中,no_items 文本没有垂直居中。
  • 你实现了吗? @MohitYadav
  • 我目前正在使用 getListView().getViewTreeObserver()addOnGlobalLayoutListener() > onGlobalLayout() 根据 no_items 文本的高度是否为 0 或 >0 将布局高度更改为 WRAP_CONTENT 和 MATCH_PARENT。当 textview 高度为 0,当前视口上不存在 textview,因此需要使布局可滚动,因此我将布局高度更改为 WRAP_CONTENT。
  • 将高度更改为WRAP_CONTENT 后是否有效? @MohitYadav
【解决方案2】:

你可以使用ConstraintLayout:

TextView

  • 使用偏向 0 的链式压缩约束使其粘在顶部。
app:layout_constraintVertical_bias="0"
app:layout_constraintVertical_chainStyle="packed"
  • 启用高度约束以将其粘贴到底部的顶部TextView
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toTopOf="@id/text_no_items"

对于底部TextView

  • 使用0dp 和顶部到顶部TextView 约束高度,底部到父级
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/description"
app:layout_constraintBottom_toBottomOf="parent"
  • 将最小高度设置为wrap,这样顶部的TextView就不会贪婪而将其推离屏幕底部。
app:layout_constraintHeight_min="wrap"

这是整个布局:

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

    <TextView
        android:id="@+id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="This is a sample description about the items you will see below. This text could be very long."
        android:textSize="32sp"
        app:layout_constrainedHeight="true"
        app:layout_constraintBottom_toTopOf="@id/text_no_items"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0"
        app:layout_constraintVertical_chainStyle="packed" />

    <TextView
        android:id="@+id/text_no_items"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:gravity="center"
        android:text="No items"
        android:textSize="48sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_min="wrap"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/description" />

</androidx.constraintlayout.widget.ConstraintLayout>

【讨论】:

  • 谢谢,我感谢您的努力,但根据我的要求,“无项目”文本不需要粘在底部的其他文本上。现在,我不再为我的问题寻找解决方案了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2019-06-02
  • 2014-07-17
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多