无法垂直居中 textview 的文本

Posted

技术标签:

【中文标题】无法垂直居中 textview 的文本【英文标题】:Can´t center textview´s text vertically 【发布时间】: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_
    android:layout_>

    <RelativeLayout
        android:id="@+id/relativelayout"
        android:layout_
        android:layout_>

        <ImageView
            android:id="@+id/icon"
            android:layout_
            android:layout_
            android:src="@drawable/picture" />

        <TextView
            android:id="@+id/title"
            android:layout_
            android:layout_
            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 中。 【参考方案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_

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

【讨论】:

好吧,但是由于我使用的是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_
        android:layout_
        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】:

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

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

    作为第一个答案,但我认为应该是 android:layout_

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

【讨论】:

两个应用程序中的图像是文本(视图)的两倍多,所以这不应该是问题。唯一的区别是,第一个是用 eclipse 创建的,第二个是用 android studio 创建的。正如其他答案中提到的那样,android:layout_height="match_parent"didn´t 工作得很好。 对不起,我之前专注于你的代码。您可以尝试将 TextView 高度设置为 android:layout_ 而不是 "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"

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

【讨论】:

以上是关于无法垂直居中 textview 的文本的主要内容,如果未能解决你的问题,请参考以下文章

xml 在TextView中水平和垂直居中文本

如何在 TextView 中水平和垂直居中文本?

在 Android 的 Textview 中以编程方式居中文本

在 LinearLayout 中将 TextView 调整为垂直居中(水平)

无法在 Flutter TextField 小部件中垂直居中输入文本和后缀

Android进阶 二十二 设置TextView文字水平垂直居中