【问题标题】:How to align the text to top of TextView?如何将文本对齐到 TextView 的顶部?
【发布时间】:2010-12-17 08:38:27
【问题描述】:

如何将文本对齐到 TextView 的顶部?
Swings setInsets() 的等效 Android API?
即文本的顶部应该从 TextView 的 (0,0) 开始

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical">

    <TextView 
        android:id="@+id/text1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="TextView" 
        android:textSize="42sp" 
        android:paddingTop="0px" 
        android:gravity="top">
    </TextView> 
</LinearLayout> 

上面的sn-p我用过,但是输出还是不如预期的
有任何想法吗?

【问题讨论】:

    标签: android layout


    【解决方案1】:

    因此,TextView 顶部的空间用于填充英语以外的字符,例如重音符号。要删除此空间,您可以在 XML 中将android:includeFontPadding 属性设置为false,也可以使用函数setIncludeFontPadding(false) 以编程方式进行。

    如果还不清楚,请查看SDK documentation for TextView

    编辑答案
    如果设置 android:includeFontPadding 属性不能完成您想要做的事情,另一种解决方案是覆盖您正在使用的 TextView 的 onDraw(Canvas canvas) 方法,以便消除 Android 添加到每个文本视图。在写下我的原始答案后,我注意到由于某种原因 TextView 除了字体填充之外还包含额外的填充。删除字体填充以及,因为这个额外的填充完美地将文本对齐到 TextView 的顶部。看下面的代码sn-p。

    public class TopAlignedTextView extends TextView {
    
        // Default constructor when inflating from XML file
        public TopAlignedTextView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        // Default constructor override
        public TopAlignedTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs);
            setIncludeFontPadding(false); //remove the font padding
            setGravity(getGravity() | Gravity.TOP); //make sure that the gravity is set to the top
        }
    
        /*This is where the magic happens*/
        @Override
        protected void onDraw(Canvas canvas){
            TextPaint textPaint = getPaint(); 
            textPaint.setColor(getCurrentTextColor());
            textPaint.drawableState = getDrawableState();
            canvas.save();
    
            //converts 5dip into pixels            
            int additionalPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getContext().getResources().getDisplayMetrics());
    
            //subtracts the additional padding from the top of the canvas that textview draws to in order to align it with the top.            
            canvas.translate(0, -additionalPadding);
            if(getLayout() != null)
                getLayout().draw(canvas);
            canvas.restore();
        }
    } 
    

    【讨论】:

    • 这真的不行。 5 像素减法似乎完全是任意的。对于足够小的文本大小,文本将与视图的边缘一起剪辑。对于较大的文本大小,烦人的额外填充将保留。
    • 非常有趣..我没有使用它,但我标记了一个最喜欢的答案,可能有用。
    【解决方案2】:

    在您的 .xml 中,写下:

    android:gravity="center|top"
    

    第一个“中心”在中心水平对齐您的线,下一个“顶部”垂直向上对齐。

    【讨论】:

      【解决方案3】:

      我相信实际字体本身的顶部和底部都有额外的空白。

      通常我所做的是给视图负边距。问题是,当设备带有不同的字体时,这看起来很糟糕。

      android:layout_marginTop="-5dp"
      android:layout_marginBottom="-5dp"
      

      您必须根据文本大小进行调整,更大的文本大小需要更多的负填充。

      【讨论】:

      • 在使用自定义字体时,在测试了许多选项,如 includeFontPadding、lineSpacingExtra 和 lineSpacingMultiplier 以删除顶部和底部字体空间后,此方法是唯一有效的方法。太糟糕了,我需要为使用的每种字体大小创建一个样式。
      【解决方案4】:

      可能,您不需要基于 TextView 制作您的视图。尝试扩展 View 并将您的文本写入onDraw()

      看这里:https://stackoverflow.com/a/32081250/1263771

      【讨论】:

        【解决方案5】:

        我认为你的 sn-p 是对的。我猜你对字母“T”的顶部和 TextView 的顶部边缘之间的一些像素感到困扰?需要这个空间来渲染一些英文字母表中不存在的字母。

        检查链接以获得想法:

        【讨论】:

        • 是的,你是对的,如果我们对此有一些控制会更好,比如我们自己覆盖这个默认行为。
        【解决方案6】:

        我不确定我是否理解您的意思,但是如果您在文本视图上使用重力=顶部,则文本视图内的文本将与顶部对齐。

        如果你在 textview 上加上背景颜色,你可能会更好地看到正在发生的事情......

        我猜你的问题是文本视图居中,因为你在父 LinearLayout 的高度和宽度上都使用了 fill_parent。 textview 似乎是唯一的孩子,所以尝试将gravity=top 放在LinearLayout ...

        这是我唯一能想到的……

        【讨论】:

          猜你喜欢
          • 2019-05-20
          • 2013-12-21
          • 2012-05-03
          • 2014-12-28
          • 2015-12-29
          • 2017-12-03
          • 2012-02-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多