Android 未在 device/emulator 上垂直居中 TextView 的文本(但在 Android Studio 的设计器视图中很好)
Android not centering TextView's text vertically on device/emulator (but fine though in Android Studio's designer view)
我有这个设置:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/postHeader">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CP"
android:id="@+id/initialsView"
android:layout_alignTop="@+id/avatarView"
android:layout_alignLeft="@+id/avatarView"
android:layout_alignBottom="@+id/avatarView"
android:layout_alignRight="@+id/avatarView"
android:background="@drawable/avatar_background"
android:textColor="@color/white"
android:gravity="center"
android:textStyle="bold"
android:textSize="16sp" />
<com.makeramen.roundedimageview.RoundedImageView
app:riv_corner_radius="20dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/avatarView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="14dp"
android:layout_marginLeft="20dp"
android:layout_marginBottom="6dp"
app:riv_border_color="@color/lightGray"
app:riv_border_width="0.2dp" />
...
/>
TextView
与图像视图正确对齐。 Android 工作室一切正常:
然而,当我在实际设备 (Android 4.4.4) 或模拟器 (Android 6.0) 上 运行 时,我得到文本 ("CP" 在屏幕截图中) 一直卡到顶部,就像我没有设置垂直重力一样。我尝试将 textAlignment
、宽度和高度设置为 match_parent
、layout_centerInParent
设置为 both
、重力设置为 center_vertical
显式、includeFontPadding
设置为 false,但无济于事。它仍然没有垂直居中(虽然水平很好)。
我做错了什么?为什么它在 Android Studio 上仍能正确显示?
好的,经过一番调查我发现了问题。好像已经坏了:https://code.google.com/p/android/issues/detail?id=63673
在 link 实施解决方案解决了我的问题:
private static final int AT_MOST_UNSPECIFIED = MeasureSpec.makeMeasureSpec((1<<30)-1, MeasureSpec.AT_MOST);
@Override
protected void onMeasure(int widthSpec, int heightSpec)
{
// RelativeLayout has bugs when measured in UNSPECIFIED height mode that were supposedly
// fixed in API 18. However the 'fix' does breaks gravity == center_vertical in TextView.
// https://code.google.com/p/android/issues/detail?id=63673
if (MeasureSpec.getMode(heightSpec) == MeasureSpec.UNSPECIFIED) heightSpec = AT_MOST_UNSPECIFIED;
super.onMeasure(widthSpec, heightSpec);
}
我有这个设置:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/postHeader">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CP"
android:id="@+id/initialsView"
android:layout_alignTop="@+id/avatarView"
android:layout_alignLeft="@+id/avatarView"
android:layout_alignBottom="@+id/avatarView"
android:layout_alignRight="@+id/avatarView"
android:background="@drawable/avatar_background"
android:textColor="@color/white"
android:gravity="center"
android:textStyle="bold"
android:textSize="16sp" />
<com.makeramen.roundedimageview.RoundedImageView
app:riv_corner_radius="20dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:id="@+id/avatarView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="14dp"
android:layout_marginLeft="20dp"
android:layout_marginBottom="6dp"
app:riv_border_color="@color/lightGray"
app:riv_border_width="0.2dp" />
...
/>
TextView
与图像视图正确对齐。 Android 工作室一切正常:
然而,当我在实际设备 (Android 4.4.4) 或模拟器 (Android 6.0) 上 运行 时,我得到文本 ("CP" 在屏幕截图中) 一直卡到顶部,就像我没有设置垂直重力一样。我尝试将 textAlignment
、宽度和高度设置为 match_parent
、layout_centerInParent
设置为 both
、重力设置为 center_vertical
显式、includeFontPadding
设置为 false,但无济于事。它仍然没有垂直居中(虽然水平很好)。
我做错了什么?为什么它在 Android Studio 上仍能正确显示?
好的,经过一番调查我发现了问题。好像已经坏了:https://code.google.com/p/android/issues/detail?id=63673
在 link 实施解决方案解决了我的问题:
private static final int AT_MOST_UNSPECIFIED = MeasureSpec.makeMeasureSpec((1<<30)-1, MeasureSpec.AT_MOST);
@Override
protected void onMeasure(int widthSpec, int heightSpec)
{
// RelativeLayout has bugs when measured in UNSPECIFIED height mode that were supposedly
// fixed in API 18. However the 'fix' does breaks gravity == center_vertical in TextView.
// https://code.google.com/p/android/issues/detail?id=63673
if (MeasureSpec.getMode(heightSpec) == MeasureSpec.UNSPECIFIED) heightSpec = AT_MOST_UNSPECIFIED;
super.onMeasure(widthSpec, heightSpec);
}