【问题标题】:android:gravity fails on API 18+android:gravity 在 API 18+ 上失败
【发布时间】:2014-01-29 22:53:15
【问题描述】:

我的应用程序上有一些 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 变大了,所以使用@987654329 @我将文本居中居中并从其自身离开。它有效,但我不知道为什么,在运行 android 4.3 和 4.4 的设备上,文本不在中心|左侧居中。此问题可以在真实设备上重现,也可以在 Eclipse 的布局预览(图形布局)上重现。

对 API 18+ 或 android:gravity 所做的任何更改是我遗漏的?

PS:我在项目和 AndroidManifest.xml 上针对 API 19

PS2:我的 TextView 是自定义的,只是为了设置一个外部 font.tff

这就是它在 API 17 上的样子-

这就是它在 API 18+ 上的样子

提前致谢!

= 更新 =

在我的 Manifest 上,我将 android:targetSdkVersion 更改为 17 而不是 19 并且问题消失了,但这是一个“技巧”,而不是解决方案,我该怎么办,因为这可能是 API 的问题?是的,我有最新版本的 API 18 和 19(今天,2014 年 1 月 30 日)。

【问题讨论】:

  • 只是出于好奇,如果 4.3 和 4.4 中的文本不是居中|左,那么它在哪里?结果与非自定义文本视图相同吗?如果没有,请显示您的自定义 textview 代码和您的布局 xml。
  • 您能否给我们看一张屏幕截图,看看它应该是什么样子,以及它看起来是什么样子?此外,您同时使用“alignParentLeft”和“layout_toLeftOf”似乎很奇怪——您是要对齐到特定视图还是父视图?
  • 我刚刚添加了你问的ss。 @androiddeveloper,alignParentLeft 用于将我的 TextView 的左边缘调整到其“父亲”的左边缘,并 toLeftOf 将我的 textView 的右边缘与我的 SeekBar 的左边缘对齐,这样我可以避免“覆盖”如果我的文本长度足够大,可以到达我的搜索栏:)
  • @Adam,文字还在,但是好像上面没有重力属性,文字定位在自它的左上角
  • @MurilloHenrique 是的,关于对齐,我很抱歉。我错了而且很困惑(以为它是在视图的右侧对齐),那是因为我很困(在 2:22 写的)。无论如何,我认为您应该为此尝试 ui 设计器。尝试将左侧的 textView 与右侧的视图对齐。或者您也可以在 textView which 上使用 layout_centerVertical="true" 。此外,您应该尝试自定义现有的 API,即 SwitchPreference 或 CheckBoxPreference,而不是重新发明整个视图。只需自定义它们的外观...

标签: java android layout gravity


【解决方案1】:

这似乎是 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

【讨论】:

    【解决方案2】:

    您的 textview 高度是“wrap_content”,这意味着 textview 的高度将与文本的高度相同。如果将 textview 的背景更改为黑色,则可能更容易看到视图的边界。我猜你会发现 textview 没有你想象的那么高。

    尝试将 textview 的高度设置为 match_parent。如果需要,您可以将 textview 包装在另一个视图中,并根据需要修改其高度。

    【讨论】:

    • 这有逻辑,我试过但没有任何改变,我可以稍后出于性能原因将其更改为 0dp,因为它的大小已定义但边缘对齐。问题出在 API 上,因为我刚刚将 Manifest 上的 android:targetSdkVersion 更改为 17 而不是 19,问题就消失了,但这不是正确的解决方案:/
    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 2019-05-23
    • 2022-12-17
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    相关资源
    最近更新 更多