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
相关产品推荐
相关产品推荐

