Как выровнять текст по верху TextView? - PullRequest
38 голосов
/ 17 ноября 2009

Как выровнять текст по верху TextView?
Эквивалентный Android API для Swings setInsets ()?
то есть начало текста должно начинаться с (0,0) TextView

<?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> 

Я использовал приведенный выше фрагмент, однако результат все равно не такой, как ожидалось Есть идеи?

Ответы [ 6 ]

65 голосов
/ 04 июля 2011

Таким образом, пространство в верхней части TextView заполнено символами за пределами английского языка, такими как ударения. Чтобы удалить это пространство, вы можете либо установить атрибут android:includeFontPadding на false в своем XML, либо вы можете сделать это программно с помощью функции setIncludeFontPadding(false).

Посмотрите документацию SDK для TextView , если это все еще неясно.

Отредактированный ответ
Если установка атрибута android:includeFontPadding не выполняет то, что вы пытаетесь сделать, другое решение - переопределить метод onDraw(Canvas canvas) используемого вами TextView, чтобы исключить дополнительный верхний отступ, который Android добавляет к каждому TextView. После написания моего исходного ответа я заметил, что по какой-то причине TextView включает в себя дополнительные отступы в дополнение к отступам шрифтов. Удаление отступов шрифта , а также , так как этот дополнительный отступ идеально выравнивает текст по верху TextView. Посмотрите на фрагмент кода ниже.

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();
    }
} 
16 голосов
/ 19 июля 2013

Я считаю, что сам шрифт имеет лишние пробелы сверху и снизу.

Обычно я делаю для просмотра негативные поля. Проблема в том, что это выглядит плохо, когда устройства поставляются с разными шрифтами.

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

Вы должны будете отрегулировать в зависимости от размера текста, большие размеры текста требуют более отрицательного заполнения.

13 голосов
/ 20 ноября 2015

В своем .xml напишите:

android:gravity="center|top"

Первый «центр» выравнивает линию по горизонтали в центре, а следующий «верх» выравнивается по вертикали.

1 голос
/ 13 декабря 2016

Возможно, вам не нужно делать свое представление на основе TextView. Попробуйте расширить Просмотр и напишите свой текст в onDraw().

Посмотрите здесь: https://stackoverflow.com/a/32081250/1263771

1 голос
/ 14 января 2010

Я думаю, что ваш фрагмент верен. Я предполагаю, что вас беспокоит несколько пикселей между верхней частью буквы "T" и верхним краем TextView? Это место требуется для отображения некоторых букв, отсутствующих в английском алфавите.

Проверьте ссылки, чтобы получить представление:

0 голосов
/ 28 ноября 2009

Я не уверен, понимаю ли я, что вы имеете в виду, но текст внутри textview будет выровнен по верху, если вы используете gravity = top в text-view.

Если вы добавите цвет фона в текстовое представление, вы лучше увидите, что происходит ...

Полагаю, ваша проблема в том, что текстовое представление центрировано, поскольку вы используете fill_parent как по высоте, так и по ширине в родительском LinearLayout. Кажется, что текстовое представление - единственный ребенок, поэтому попробуйте поместить в поле LinearLayout gravity = top ...

Это единственное, о чем я мог подумать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...