首页 > 解决方案 > 当其他文本视图垂直扩展时,如何使文本视图始终显示在屏幕上?

问题描述

我有一个带有两个 textViews 的 android 布局文件,第一个可能包含长文本,沿屏幕空间垂直扩展,另一个 textview 仅包含一行文本。

两个 textViews 开始在屏幕上垂直居中,第二个在第一个下方。

碰巧第一个 textview 的内容可以更改,向其中添加更多文本,并且在某些时候第一个 textview 扩展并占据整个屏幕,将第二个 textview 推到屏幕外。

我需要第二个文本视图在到达屏幕边界时不会被推到屏幕外,第二个文本视图必须拥有屏幕上的最后一块空间来存放其内容。

这是我的代码:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">


    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

        <TextView
            android:id="@+id/firstTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/secondTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true" />

     </LinearLayout>

</RelativeLayout>

标签: android-layout

解决方案


ConstraintLayout救援!

build.gradle内部app模块中的依赖关系:

implementation 'com.android.support.constraint:constraint-layout:1.1.3'

您想要实现的非常基本的布局应该是这样的:

<android.support.constraint.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_width="match_parent"
        android:layout_height="match_parent">

    <TextView
        android:id="@+id/text1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:padding="8dp"
        android:scrollbars="vertical"
        android:text="*YOUR ENDLESS TEXT HERE*"
        android:textSize="14sp"
        app:layout_constraintBottom_toTopOf="@id/barrier"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="top"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:singleLine="true"
        android:text="*YOUR SINGLE LINE TEXT HERE*"
        android:textSize="14sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/barrier" />
</android.support.constraint.ConstraintLayout>

原因:

  1. ConstraintLayout 使您想要实现的开发变得更加容易。
  2. ConstraintLayout 提供Barrier,它可以停止将视图扩展到其边界之外,这些视图被引用。

在这里,在我们的例子中,这是布局的作用:首先TextView扩展以拉伸和覆盖可用的整个视图,其次TextView锁定在底部,就像你想要的那样。现在Barrier将阻止第一个TextView缩放超出其边界,为底部的第二个提供固定空间。

重要提示:要先滚动您的内容TextView,您需要在 java 文件中添加以下行:

TextView text1 = (TextView) findViewById(R.id.text1);
text1.setMovementMethod(new ScrollingMovementMethod());

上面的声明将帮助您滚动内容直到它结束,无论它有多大,在您TextView自己内部,所以ScrollView不需要!

希望这可以帮助 :)

参考: ConstraintLayout - Android 开发者文档


推荐阅读