Как центрировать текст по горизонтали и вертикали в TextView?


2028

Как отцентрировать текст по горизонтали и вертикали в a TextView, чтобы он отображался точно по центру TextViewin Android?


7
установите для layout_width и layout_height значение fill_parent, затем установите гравитацию в центр. Это
сработает

2
fill_parent устарел, поэтому используйте MATCH_PARENT в layout_width и layout_height и установите гравитацию TextView в центр.
Билал Ахмад

Ответы:


3086

Я предполагаю, что вы используете макет XML.

<TextView  
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center"
    android:text="@string/**yourtextstring**"
/>

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

и как @stealthcopter прокомментировал в Java: .setGravity(Gravity.CENTER);


58
Это не работает при использовании с RelativeLayout, где высота и ширина макета установлены на wrap_content
Роб

96
@Rob, если ширина и высота wrap_content, то технически текст уже центрирован.
JoJo

3
Если я хочу выровнять TextView относительно другого представления, но текст сосредоточен сам по себе?

9
Это не работает для меня ( android:gravity="center"). Это все еще показывает в крайнем левом углу экрана. :(
УСЕРНАМЕХАХАХАХА

30
Не путать с тем android:layout_gravity="center", что делает что-то еще.
Руди Кершоу

445
android:gravity="center" 

Это сделает свое дело


32
Текстовое представление должно быть match_parent или fill_parent, чтобы это работало. Если его обернуть содержимое, то он не будет в центре.
Калель Уэйд,

7
@KalelWade: центрирование текста в текстовом представлении с помощью wrap_content не имеет никакого смысла. Возможно, вы думаете о центрировании текстового представления в родительском представлении, и в этом случае вы просто помещаете эту строку в родительское представление.
Mooing Duck

@Mooing Duck Таким образом, причина не использовать перенос содержимого - это не имеет смысла. Но когда вы либо справляетесь и вставляете, либо просто торопитесь, вы не можете сложить два и два. Вот почему я упомянул это.
Калель Уэйд

1
если TextView с шириной и высотой, равной «wrap_content», находится внутри LinearLayout с шириной и высотой «match_parent», то вам нужно установить layout_gravity для Linear_layout.
Фейсал Насир

1
@MooingDuck, когда высота равна «wrap_content», а сила тяжести - «center_vertical», в Design (предварительный просмотр) он отображается по центру, но в устройстве он располагается сверху. Так что сделайте высоту «match_parent» и установите гравитацию «center_vertical» или «center».
CoolMind

298

Вы также можете настроить его динамически, используя:

textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);

142
Или просто textview.setGravity (Gravity.CENTER);
Amplify91

Каковы критерии суждения, чтобы решить, какой путь выбрать, писать в xml или писать в файле Java?
кендзю

2
@ Кенджу, если вы хотите, чтобы он был легко редактируемым и значение не будет меняться во время выполнения: XML. Если вам нужно изменить значение в реальном времени (например, изменить выравнивание, когда пользователь нажимает кнопку), то вы можете сделать это только через Java.
Густаво Масиэль

2
@GustavoMaciel так, в основном xml, если это не нужно изменять динамически ... Теперь я получил это. Спасибо за ваш простой и полезный ответ!
кендзю

115
android:layout_centerInParent="true"

Это работает при использовании с RelativeLayout, где высота и ширина макета установлены на wrap_content.


19
Это центрирует TextView, а не текст в нем.
антропомо

2
Это НЕ работает, когда есть перенос слов в TextView. Текст будет полноразмерным, многострочным и выровненным по левому краю TextView. На дисплее оно будет выровнено по левому краю. Вы должны использовать «гравитацию», как указано в других ответах.
Дэвид Мэнпирл

83

Вы также можете использовать комбинацию:

android:gravity="left|center"

Затем, если ширина textview больше, чем "fill_parent", текст все равно будет выровнен по левому краю (не по центру, так как гравитация установлена ​​только на "center").


56

Применить гравитацию:

TextView txtView = (TextView) findViewById(R.id.txtView);
txtView.setGravity(Gravity.CENTER_HORIZONTAL);

Для вертикальной:

txtView.setGravity(Gravity.CENTER_VERTICAL);

В XML:

<TextView      
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center"
    android:text="@string/Hello_World"        
/>

42

Есть два способа сделать это.

Первый в коде XML. Вам нужно обратить внимание на GravityАтрибут. Вы также можете найти этот атрибут в графическом редакторе; это может быть проще, чем редактор XML.

<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_vertical|center_horizontal"
    android:text="Your Text"
/>

Для вашего конкретного сценария значения гравитации будут:

center_vertical|center_horizontal

В графическом редакторе вы найдете все возможные значения, даже увидите их результаты.


41

Если вы используете TableLayout, не забудьте также установить центр тяжести TableRows. В противном случае это не будет работать. По крайней мере, это не работало со мной, пока я не установил гравитацию TableRow в центр.

Например, вот так:

<TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center">        
    <TextView android:text="@string/chf" android:id="@+id/tv_chf" android:layout_weight="2" android:layout_height="wrap_content" android:layout_width="fill_parent" android:gravity="center"></TextView>        
</TableRow>

Интересно. Необходимо также проверить, действительно ли это для LinearLayout (родитель TableRow).
Мартин

38

Вам нужно установить TextView Gravity (Center Horizontal и Center Vertical) следующим образом:

android:layout_centerHorizontal="true"   

а также

android:layout_centerVertical="true"

И динамически используя:

textview.setGravity(Gravity.CENTER);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);

Семантика кода неверна. Замените layout_centerhorizontalи layout_centerverticalна layout_centerHorizontalи layout_centerVertical(«H» и «V» в верхнем регистре, иначе это не будет работать).
Югидроид

2
layout_ * сообщает родителю вида, где он хочет быть. Без layout_ * рассказывает View, как разместить его компоненты
Dandre Allison

34

По моему мнению,

android:gravity="center"

лучше, чем,

android:layout_centerInParent="true"

что лучше чем,

android:layout_centerHorizontal="true"
android:layout_centerVertical="true"

по крайней мере для форматирования текста.


30

Для линейного макета: в XML используйте что-то вроде этого

<TextView  
    android:id="@+id/textView1"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_vertical|center_horizontal"
    android:text="Your Text goes here"
/>

Чтобы сделать это во время выполнения, используйте что-то подобное в своей деятельности

TextView textView1 =(TextView)findViewById(R.id.texView1);
textView1.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);

Для Относительного расположения: в XML используйте что-то вроде этого

<TextView  
    android:id="@+id/textView1"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_centerInParent="true"
    android:text="Your Text goes here"
/>

Чтобы сделать это во время выполнения, используйте что-то подобное в своей деятельности

TextView textView1 =(TextView)findViewById(R.id.texView1);
RelativeLayout.LayoutParams layoutParams = RelativeLayout.LayoutParams)textView1.getLayoutParams();
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
textView1.setLayoutParams(layoutParams);

24

Используйте в файле XML.

Файл макета

<TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:text="@string/stringtext"/>

или:

Используйте это внутри класса Java

TextView textView =(TextView)findViewById(R.id.texviewid);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);

21

Используйте это для относительного расположения

android:layout_centerInParent="true"

и для другого макета

android:gravity="center" 

18

Если TextView'sвысота и ширина - wrap contentто текст внутри TextViewвсегда будет в центре. Но если TextView'sширина равна, match_parentа высота равна match_parentили равна, wrap_contentвы должны написать следующий код:

Для RelativeLayout:

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center" 
        android:text="Hello World" />

</RelativeLayout>

Для LinearLayout:

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Hello World" />

</LinearLayout>

17

Хотя использование гравитации работает для TextView, есть альтернативный метод, реализованный на уровне API 17 -

textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);

Не знаю разницы, но это тоже работает. Однако только для уровня API 17 или выше.


Разница описана здесь: stackoverflow.com/questions/16196444/…
jasdefer

Это действительно отцентрирует текст в TextView. Если вы просто используете гравитацию, есть небольшой отступ, в зависимости от того, что текст ... Например, если у вас есть маленький значок круга с текстом в центре, вы можете увидеть очень очевидную разницу.
tarrball

14

Во RelativeLayout, будет приятно с этим.

И еще, Buttonи все, что вы можете добавить.

Следующее работает хорошо для меня.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ff314859"
    android:paddingLeft="16dp"
    android:paddingRight="16dp">
    <TextView 
        android:id="@+id/txt_logo"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="your text here"
        android:textSize="30dp"
        android:gravity="center"/>

        ...other button or anything else...

</RelativeLayout>

11

Самый простой способ (который удивительно упоминается только в комментариях, поэтому я и публикую в качестве ответа) это:

textview.setGravity(Gravity.CENTER)


10

Если вы пытаетесь центрировать текст на TableRow в TableLayout, вот как я этого добился:

<TableRow android:id="@+id/rowName"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:padding="5dip" >
    <TextView android:id="@+id/lblSomeLabel"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:gravity="center"
              android:layout_width="0dp"
              android:layout_weight="100"
              android:text="Your Text Here" />
</TableRow>

10

использование android:textAlignment="center"

       <TextView
        android:text="HOW WAS\nYOUR\nDAY?"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:id="@+id/textView5"
         />

textAlignment = "center" не будет выполнять эту работу до тех пор, пока TextView не будет иметь размеры для match_parent
SAurabh

Приведенный выше пример @Surabh работает без проблем.
Chathura Wijesinghe

это работает без гравитации к родительской или макет гравитации сам по себе? Не будет выравнивания текста, чтобы выровнять текст в границах его вида, поэтому пока textView не получит match_parent, в этом случае это не будет выглядеть без гравитации в его родительском макете или layout_gravity
SAurabh

9

Вот мой ответ, который я использовал в своем приложении. Он показывает текст в центре экрана.

<TextView
    android:id="@+id/txtSubject"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/subject"
    android:layout_margin="10dp"
    android:gravity="center"
    android:textAppearance="?android:attr/textAppearanceLarge" />

9

Если вы используете Относительный макет:

  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/stringname"
    android:layout_centerInParent="true"/>

Если вы используете LinearLayout

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/stringname"
    android:layout_gravity="center"/>

8

Как и многие ответы предлагают выше работает нормально.

android:gravity="center"

Если вы хотите отцентрировать его по вертикали:

android:gravity="center_vertical"

или только горизонтально:

android:gravity="center_horizontal"


7

Вы можете сделать это, чтобы центрировать текст

<TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center" />

7

Высота и ширина TextView - это содержимое переноса, затем текст в пределах textview всегда центрируется, а затем делается по центру в его родительском макете с помощью:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello.."/>
</RelativeLayout>

Для LinearLayout также код такой же:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello.."/>
</LinearLayout>

и программно родительским является Java-код RelativeLayout, это во время выполнения использовать что-то подобное в вашей деятельности

TextView textView1 =(TextView)findViewById(R.id.texView1);
RelativeLayout.LayoutParams layoutParams = RelativeLayout.LayoutParams)textView1.getLayoutParams();
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
textView1.setLayoutParams(layoutParams);

6

Мы можем достичь этого несколькими способами:

XML метод 01

<TextView  
    android:id="@+id/textView"
    android:layout_height="match_parent"
    android:layout_width="wrap_content" 
    android:gravity="center_vertical|center_horizontal"
    android:text="@strings/text"
/>

XML метод 02

<TextView  
    android:id="@+id/textView"
    android:layout_height="match_parent"
    android:layout_width="wrap_content" 
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@strings/text"
/>

XML метод 03

<TextView  
    android:id="@+id/textView"
    android:layout_height="match_parent"
    android:layout_width="wrap_content" 
    android:gravity="center"
    android:text="@strings/text"
/>

XML метод 04

<TextView  
    android:id="@+id/textView"
    android:layout_height="match_parent"
    android:layout_width="wrap_content" 
    android:layout_centerInParent="true"
    android:text="@strings/text"
/>

Java метод 01

textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);

Java метод 02

textview.setGravity(Gravity.CENTER);

Java метод 03

textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);

6

TextView гравитация работает в соответствии с вашим родительским макетом.

LinearLayout :

Если вы используете LinearLayout, то вы найдете два гравитационных атрибута android: gravity & android: layout_gravity

android: gravity: представляет зелье макета внутреннего текста TextView, а android: layout_gravity: представляет позицию TextView в родительском представлении.

введите описание изображения здесь

Если вы хотите установить текст горизонтально и вертикально по центру, используйте приведенный ниже код

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300dp"
    android:background="@android:color/background_light"
    android:layout_height="300dp">

    <TextView
        android:layout_width="match_parent"
        android:text="Hello World!"
        android:gravity="center_horizontal"
        android:layout_gravity="center_vertical"
        android:layout_height="wrap_content"
    />
</LinearLayout>

RelativeLayout :

Используя RelativeLayout вы можете использовать свойство ниже в TextView

android: gravity = "center" для текстового центра в TextView.

android: gravity = "center_horizontal" внутренний текст, если вы хотите горизонтально центрировать.

android: gravity = "center_vertical" внутренний текст, если вы хотите по центру.

android: layout_centerInParent = "true", если вы хотите, чтобы TextView находился в центральной позиции родительского представления. android: layout_centerHor horizontal = "true", если вы хотите, чтобы TextView находился в горизонтальном центре родительского представления. android: layout_centerVertical = "true", если вы хотите, чтобы TextView располагался вертикально в центре родительского представления.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="300dp"
    android:background="@android:color/background_light"
    android:layout_height="300dp">

    <TextView
        android:layout_width="match_parent"
        android:text="Hello World!"
        android:gravity="center"
        android:layout_centerInParent="true"
        android:layout_height="wrap_content"
    />
</RelativeLayout>

Кстати, по какой причине вы откатились на предыдущую ревизию? Вернутая вами ревизия является хорошей практикой, так как то, что упомянул редактор, может помочь текстовым редакторам в кодировании.
Эдрик

5

Попробуй так, будет работать

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center_horizontal|center_vertical">

                    <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAlignment="center"
                    />

            </LinearLayout>

5

На самом деле, мы можем добиться большего успеха, исключив fontPadding.

<TextView
  android layout_height="wrap_content"
  android layout_height="wrap_content"
  android:includeFontPadding="false"
  android:textAlignment="center"
/>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.