Nick Fanelli
Nick Fanelli

Reputation: 284

How to vertically align text within TextView

I am trying to get some text vertically aligned within a TextView, but for some reason it just sticks to the top edge of such TextView.

Trust me, I've read several questions here on Stack Overflow regarding the same, or similar, questions and tried applying the provided solutions, but nothing seems to make a change.

For instance, what I thought would solve the issue right away was to add the attribute android:gravity="center_vertical|left", but that didn't help either.

This user's question describes almost exactly my issue, except that his TextView is inside a RelativeLayout which in turn is inside a ScrollView, which I don't (and don't need or want to) use. And the images he provided are also perfectly applicable to what I'm trying to describe and achieve.

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

    <ImageView
        android:id="@+id/account_server_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/account_server_icon"
        android:paddingLeft="16dp"
        android:gravity="left" />    

    <TextView
        android:orientation="vertical"
        android:id="@+id/tv_account"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="16dp"
        android:gravity="left|center_vertical" />

</LinearLayout>

Upvotes: 0

Views: 4794

Answers (3)

Khalid Almannai
Khalid Almannai

Reputation: 312

You need to set gravity then you set text alignment to gravity

<TextView
    android:orientation="vertical"
    android:id="@+id/tv_account"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="16dp"
    android:gravity="left|center_vertical"
    android:textAlignment="gravity"
 />

Upvotes: 0

PedroHawk
PedroHawk

Reputation: 630

as your achievement suggest, you only need to change your gravity to layout_gravity

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

    <ImageView
        android:id="@+id/account_server_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/account_server_icon"
        android:paddingLeft="16dp"
        android:gravity="left" />    

    <TextView
        android:orientation="vertical"
        android:id="@+id/tv_account"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="16dp"
        android:layout_gravity="left|center_vertical" />

</LinearLayout>

Upvotes: 1

Bryan Herbst
Bryan Herbst

Reputation: 67189

The problem is that your TextView's height is set to wrap_content. This means that the size of the text's container will be the same as the height of the text, thus there really is nowhere within the view to center the content (it is effectively already centered vertically).

If the LinearLayout that you posted only contains the ImageView and the TextView, then you can simple change the height to match_parent and it should work fine.

If the LinearLayout contains other Views, you might want to consider using a RelativeLayout and setting the TextView to align with both the top and bottom of the image.

Upvotes: 3

Related Questions