2009-11-17 5 views
32

Как выровнять текст в верхней части TextView?
Эквивалентный API Android для Swings setInsets()?
, что верхняя часть текста должна начинаться быть в (0,0) из TextViewКак выровнять текст в верхней части 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> 

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

ответ

58

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

Посмотрите на SDK documentation for TextView, если это все еще неясно.

EDITED ОТВЕТ
Если установка атрибута 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(); 
    } 
} 
+0

http://code.google.com/p/android/issues/detail?id=8435 :-( – Blundell

+0

Почему это не работает для меня ?! –

+0

Да, это не работает для меня либо – JPM

0

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

Если поставить цвет backgrund на вас TextView вы могли лучше видеть, что происходит ...

Я думаю, вы проблема заключается в том, что TextView центрирована, так как вы используете fill_parent на высоте и ширине на родительском LinearLayout , TextView, кажется, единственный ребенок, поэтому постарайтесь положить тяжесть = верх на LinearLayout ...

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

+0

Я попытался это тоже, но не использовать .. –

1

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

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

+0

Да, вы правы, это лучше, если мы имеем некоторый контроль над этим, как переопределить это поведение по умолчанию, по нашим собственным. –

16

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

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

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

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

+0

При использовании пользовательских шрифтов после тестирования многих параметров, таких как includeFontPadding, lineSpacingExtra и lineSpacing Множитель для удаления верхних и нижних пространств шрифтов, этот метод является единственным, что сработало. Жаль, что мне нужно создать стиль для каждого используемого размера шрифта. – Gero

5

В вашем .xml, пишут, что:

android:gravity="center|top" 

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

1

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

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