You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何移除垂直旋转TextView的多余空白

如何移除垂直TextView下方的多余空白?

我创建了一个显示垂直TextView的Activity,该TextView(id为app_mode)下方存在多余空白,对应的布局代码如下:

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

<LinearLayout 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:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/Theme.MyApplication.AppBarOverlay">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/Theme.MyApplication.PopupOverlay"
        app:contentInsetLeft="0dp"
        app:contentInsetStart="0dp"
        app:contentInsetStartWithNavigation="0dp">

        <TextView
            android:id="@+id/app_mode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="AppMod"
            android:textStyle="bold"
            android:rotation="-90"
            android:gravity="fill_vertical"
            android:includeFontPadding="false"
            android:background="@drawable/text_border"
            android:onClick="onAppModeChange"
            android:clickable="true"
            />

        <LinearLayout
            android:id="@+id/tbViewsLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">


            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:paddingLeft="5dp"
                android:paddingRight="5dp"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tb_1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Line 1"
                    android:singleLine="true"
                    android:ellipsize="marquee"
                    android:marqueeRepeatLimit="marquee_forever"
                    android:focusableInTouchMode="true"
                    android:focusable="true"
                    android:textColor="@android:color/white"
                    android:textStyle="bold"
                    />

                <TextView
                    android:id="@+id/tb_2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="-5dp"
                    android:text="Line 2"
                    android:singleLine="true"
                    />

                <TextView
                    android:id="@+id/tb_3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="-5dp"
                    android:text="Line 3"
                    android:singleLine="true"
                    />

            </LinearLayout>
        </LinearLayout>

    </androidx.appcompat.widget.Toolbar>

</com.google.android.material.appbar.AppBarLayout>

</LinearLayout>

问题截图


解决方案

问题根源是TextView通过xml设置旋转后,系统只会旋转绘制内容,但原始的宽高占位逻辑不会自动调整,wrap_content会基于未旋转的文本尺寸预留空间,导致出现多余空白。以下是几种实用解决方法:

方法1:代码中旋转并交换布局参数

在Activity的onCreate方法里添加这段代码,手动调整TextView的布局宽高,适配旋转后的实际显示尺寸:

TextView appModeTv = findViewById(R.id.app_mode);
appModeTv.setRotation(-90);
// 交换宽高参数,让布局适配旋转后的显示
ViewGroup.LayoutParams params = appModeTv.getLayoutParams();
int temp = params.width;
params.width = params.height;
params.height = temp;
appModeTv.setLayoutParams(params);

方法2:用ConstraintLayout约束位置

把app_mode TextView放到ConstraintLayout中,通过约束让它完全贴合Toolbar的上下边缘,消除多余占位:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/Theme.MyApplication.PopupOverlay"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    app:contentInsetStartWithNavigation="0dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/app_mode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="AppMod"
            android:textStyle="bold"
            android:rotation="-90"
            android:includeFontPadding="false"
            android:background="@drawable/text_border"
            android:onClick="onAppModeChange"
            android:clickable="true"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>

    <!-- 原tbViewsLayout布局保持不变 -->
</androidx.appcompat.widget.Toolbar>

方法3:固定宽高(适合文本固定场景)

如果AppMod文本内容不会变化,可以直接给TextView设置和旋转后匹配的宽高,避免wrap_content带来的多余空间:

<TextView
    android:id="@+id/app_mode"
    android:layout_width="40dp" <!-- 对应旋转后的显示高度 -->
    android:layout_height="wrap_content"
    android:text="AppMod"
    android:textStyle="bold"
    android:rotation="-90"
    android:includeFontPadding="false"
    android:background="@drawable/text_border"
    android:onClick="onAppModeChange"
    android:clickable="true"
    android:gravity="center"/>

内容的提问来源于stack exchange,提问作者Riskhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:57:02