【问题标题】:Can´t center textview´s text vertically无法垂直居中 textview 的文本
【发布时间】:2013-09-14 11:19:02
【问题描述】:

[已解决] 我必须在 ScrollView 中添加 android:fillViewport="true",这解决了文本不垂直居中的问题。

我知道这已经回答过很多次了,但我仍然无法将 textview 的文本垂直居中。

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/relativelayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/icon"
            android:layout_width="@dimen/icon_width"
            android:layout_height="@dimen/icon_height"
            android:src="@drawable/picture" />

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/icon"
            android:gravity="center_vertical"
            android:layout_alignBottom="@+id/icon"
            android:layout_alignTop="@+id/icon"
            android:text="@string/title_text"
            android:textSize="@dimen/textsize"
            android:textStyle="bold"
            android:textColor="@color/color"
            android:shadowColor="@color/shadow"
            android:shadowRadius="5"/>

        </RelativeLayout>
</ScrollView>

通常这应该适用于

android:gravity="center_vertical"

但它对文本视图没有影响...

奇怪的是,我有第二个应用程序,它的代码完全相同,而且它在那里运行没有任何问题。

/编辑

为了澄清我的问题: 这就是我现在拥有的:


这就是我想要的:

【问题讨论】:

  • 由于高度上没有多余的空间,android:gravity 没有空间将文本居中,将 android:gravity 更改为 android:layout_gravity
  • 为什么你有android:layout_alignBottom="@+id/icon" android:layout_alignTop="@+id/icon" 作为xml文件的一部分?如果您希望TextView 居中对齐,那应该是唯一的属性。
  • 因为我认为我可以轻松地将文本垂直居中在 textview 中。

标签: android textview center


【解决方案1】:

要达到你想要的结果,去掉就够了

android:gravity="center_vertical"
android:layout_alignBottom="@+id/icon"
android:layout_alignTop="@+id/icon"

并添加

android:layout_centerVertical="true"

改为。

【讨论】:

  • 这只是为我将文本视图集中在屏幕上,这不是我想要做的(请查看原始问题中 /edit 之后的 2 个示例)
  • 不,这将使 TextView 在您的相对布局中居中,高度为 wrap_content,因此它会包裹您的 ImageView 并在此容器中垂直写入 android:layout_centerVertical="true" 定位 TextView,这有点像您想要的。跨度>
  • 不,这不是我想要的。我不想在相对布局中将 textview 居中。这就是我想要的:i.imgur.com/9T8CyT6.png 这就是我现在拥有的:i.imgur.com/WwHCegq.png
  • 在这种情况下,只需添加另一个将只包含 ImageView 和 TextView 的 RelativeLayout ;)
【解决方案2】:

android:gravity 指定父级将如何定位其子级。在这种情况下,父级是 TextView,子级是该视图中的实际文本。如果 TextView(父)不比文本(子)宽,那么重力将不起作用。

供参考的 android:gravity 文档:

指定如何通过视图的 x 轴和/或 y 轴对齐文本 文本小于视图。

像这样设置 TextView 的宽度:

android:layout_width="match_parent"

这应该会导致文本垂直居中。

【讨论】:

  • 好吧,但是由于我使用的是android:layout_alignBottom="@+id/icon" & android:layout_alignTop="@+id/icon",所以 textview 不应该和 imageview 一样高吗?另外,我想将文本垂直居中,而不是水平居中
【解决方案3】:

当您使用相对布局时,您可以添加到您的 TextView:

`android:layout_centerVertical="true"`

【讨论】:

  • 但你也应该在添加之前消除 android:layout_alignBottom="@+id/icon" android:layout_alignTop="@+id/icon" : android:layout_centerVertical="true" 我已经测试过了,它对我有用
  • 这只是为我将文本视图集中在屏幕上,这不是我想要做的(查看原始问题中 /edit 之后的 2 个示例)
  • @f4bzen 请尝试在您的描述中更具体,以便我们为您提供帮助
  • 请看原问题中的编辑:这就是我现在拥有的:i.imgur.com/WwHCegq.png这就是我想要的:i.imgur.com/9T8CyT6.png
【解决方案4】:

如果您只关心您的文本本身,一个可行的解决方案(以上所有方法都不起作用)是使 textView 与 imageView 一样高(通过将其对齐到顶部没有边距,底部到 id “其他视图”),然后在此文本框中使用 android:gravity="center"(确保没有其他对齐方式干扰此重力)

【讨论】:

    【解决方案5】:

    用这段代码替换你的TextView,它会正常工作

            <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/icon"
            android:layout_alignParentTop="true"
            android:layout_alignTop="@+id/icon"
            android:layout_toRightOf="@+id/icon"
            android:shadowColor="@color/shadow"
            android:shadowRadius="5"
            android:text="@string/title_text"
            android:textColor="@color/color"
            android:textSize="@dimen/textsize"
            android:textStyle="bold" />
    

    【讨论】:

    • 这只是为我将文本视图集中在屏幕上,这不是我想要做的(请查看原始问题中 /edit 之后的 2 个示例)
    • 你需要进一步澄清你的问题,你可以考虑这个官方文档。 developer.android.com/guide/topics/ui/layout/relative.html
    • 请查看我在原始问题中的编辑:这就是我现在拥有的:i.imgur.com/WwHCegq.png 这就是我想要的:i.imgur.com/9T8CyT6.png
    • 我已经用这个替换了 TextView,我添加了 android:layout_alignParentTop="true" 以使其位于相对布局的顶部
    • 遗憾的是这并没有解决它,但我有点能够修复自己:我不得不将 android:fillViewport="true" 添加到 ScrollView 并且我的 TextView 中的文本现在完美居中,即使我的自己的代码。
    【解决方案6】:

    我认为您可以尝试以下方法之一:

    1. 在TextView中,设置android:layout_centerVertical="true"

    1. 作为第一个答案,但我认为应该是 android:layout_height="match_parent"

    我猜为什么你在第二个应用程序中的代码有效,也许图像的高度等于 textView

    【讨论】:

    • 两个应用程序中的图像是文本(视图)的两倍多,所以这不应该是问题。唯一的区别是,第一个是用 eclipse 创建的,第二个是用 android studio 创建的。正如其他答案中提到的那样,android:layout_height="match_parent"didn´t 工作得很好。
    • 对不起,我之前专注于你的代码。您可以尝试将 TextView 高度设置为 android:layout_height="0dp" 而不是 "wrap_content" 吗?我认为 wrap_content 高度与 alignTop 和 Bottom 冲突
    【解决方案7】:

    对于遇到此问题的其他人,api 18 后的相对布局中存在错误,请参阅https://code.google.com/p/android/issues/detail?id=59368

    一个对我有用的解决方法是用这段代码替换我的相对布局(在上面的链接中找到)

    免责声明:这只适用于一种特定情况。它在另一个方面失败了。如果你愿意,请随意尝试

    public class FixRelativeLayoutBug extends RelativeLayout {
        public FixRelativeLayoutBug(Context context) {
            super(context);
        }
    
        public FixRelativeLayoutBug(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public FixRelativeLayoutBug(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        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 not work with 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);
        }
    }
    

    【讨论】:

      【解决方案8】:

      要在 TextView 的范围内精确地垂直居中文本,您可以使用:

      android:gravity="center_vertical"
      

      如果您仍然有一个小的错位,其中文本看起来不是完全垂直居中,这可能取决于您的字体填充。试试:

      android:includeFontPadding="false"
      

      字体填充有时会使文本稍微偏离中心,这样会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-11
        • 2014-03-23
        • 2013-10-15
        • 2013-10-25
        • 1970-01-01
        • 2013-07-31
        • 2012-04-14
        • 1970-01-01
        相关资源
        最近更新 更多