android:gravity 在 API 18+ 上失效。

5

我在我的应用程序中有一些TextView,但是我不知道为什么android:gravity属性在运行API 18+(4.3+)的设备上不能将文本内容居中。

这是我在自定义TextView中使用的代码,它是RelativeLayout的子级:

<com.package.custom.CustomTextFont
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/seekbar"
    android:layout_alignParentLeft="true"
    android:layout_alignTop="@+id/seekbar"
    android:layout_marginLeft="@dimen/margin_tiny_double"
    android:layout_toLeftOf="@+id/seekbar"
    android:gravity="center_vertical|left"
    android:paddingRight="@dimen/margin_tiny"
    android:text="@string/text1"
    android:textColor="@color/black"
    android:textSize="@dimen/size_text_normal" />

这段代码应该将这个TextView的边缘与顶部和底部对齐,并将其放置在SeekBar的左侧,这是有效的,但是TextView会变大,因此使用android:gravity将文本居中到中心并向左对齐。它有效,但我不知道为什么,在运行Android 4.3和4.4的设备上,文本没有居中对齐。这个问题可以在真实设备上以及Eclipse的布局预览(图形布局)上重现。
是否有任何更改针对API 18+或android:gravity我错过了?
PS:我在项目和AndroidManifest.xml中瞄准API 19
PS2:我的TextView是自定义的,只用于设置外部字体.tff
这是API 17-的外观:
这是API 18+的外观:
提前致谢!
=更新=
在我的清单中,我将android:targetSdkVersion从19更改为17,问题消失了,但这是一个“技巧”,而不是解决方案。如果这是API的问题,我该怎么办?是的,我有API 18和19的最新版本(今天,2014年1月30日)。

1
只是出于好奇,如果在4.3和4.4中文本不是居中或左对齐的,那么它在哪里呢?非自定义TextView时结果是否相同?如果不是,请展示你的自定义TextView代码和布局XML。 - Adam
请问您能否给我们展示一下它应该是什么样子和实际上是什么样子的屏幕截图?另外,您同时使用了"alignParentLeft"和"layout_toLeftOf"这两个属性,看起来有些奇怪。您是想对齐到特定的视图还是父视图? - android developer
你难道没有把重力和layout_gravity混淆吗? - gian1200
你确定吗?因为当android:layout_height="wrap_content"时,android:gravity="center_vertical"是无用的。 - gian1200
是的@gian1200,实际上它的高度由android:layout_below和android:layout_alignParentBottom定义,出于性能原因,我甚至可以将其高度设置为0dp,因为它的高度是由视图边界定义的,我描述的结果也会相同。 - Murillo Ferreira
显示剩余5条评论
2个回答

12

这似乎是API 18+中已知的问题:

https://code.google.com/p/android/issues/detail?id=59368 https://code.google.com/p/android/issues/detail?id=59700

当TextView作为可滚动容器(例如ListView)的一部分时,该问题似乎会发生,导致视图由于某种原因忽略了垂直重力(一些来源建议这与TextView是RelativeLayout的子项有关,尽管我的经验是即使没有涉及此类布局也会出现此问题)。

一个可能的解决方法(虽然不是特别优雅),是将TextView包装在LinearLayout中。然后可以在TextView上使用“layout_gravity”将其居中放置在LinearLayout中,而不是依赖于“gravity”(只需确保使用“wrap_content”,以使文本本身正确居中即可)。

例如,在您的示例中:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignBottom="@+id/seekbar"
    android:layout_alignParentLeft="true"
    android:layout_alignTop="@+id/seekbar"
    android:layout_toLeftOf="@+id/seekbar"
    android:layout_marginLeft="@dimen/margin_tiny_double" >

    <com.package.custom.CustomTextFont
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="left"
        android:paddingRight="@dimen/margin_tiny"
        android:text="@string/text1"
        android:textColor="@color/black"
        android:textSize="@dimen/size_text_normal" />

</LinearLayout>

这种方法的缺点是会在视图层次结构中添加一个不必要的级别,但目前似乎只有这种方法可以解决这个问题(除非回退到早期的API级别)。

另请参见类似问题: Android sdk 18 TextView gravity doesn't work vertically


1
你的文本视图高度为“wrap_content”,这意味着文本视图的高度将与文本的高度相同。如果你将文本视图的背景更改为黑色,可能会更容易看到视图的边界。我猜你会发现文本视图的高度不如你预期的那么高。
尝试将文本视图的高度设置为match_parent。如果需要,你可以将文本视图包装在另一个视图中,并根据需要修改其高度。

这里有逻辑,我已经尝试过了但是没有改变。我可以稍后将其改为0dp以提高性能,因为它的大小已经定义,但是边缘对齐的问题存在。问题出在API上,因为我刚刚在清单文件中将android:targetSdkVersion从19改成了17,问题就消失了,但这不是正确的解决方案 : / - Murillo Ferreira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接