Centered textview does not appear in RelativeLayout

Refresh

December 2018

Views

57 time

2

I have a TextView, which I need to be centered horizontally and vertically inside a square. To do this, I have put it inside a RelativeLayout:

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

    <TextView
        android:id="@+id/centered_text_view_text"
        android:layout_centerInParent="true"
        android:text="test"
        android:background="#00ff00"
        android:textColor="#000"
        android:textSize="16dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

I instantiate the RelativeLayout with a LayoutInflater and then call the layout method on the RelativeLayout to position it where I need it.

        LayoutInflater inflater = Helpers.getInflater();
        containerLayout = (RelativeLayout) inflater.inflate(R.layout.centered_text_view, null);
        textView = (TextView) containerLayout.findViewById(R.id.centered_text_view_text);
        ... (later in the code)
        containerLayout.layout(dayLeft, weekTop, dayRight, weekBottom);

My problem is that the TextView is not visible. I can see the white background for the RelativeLayout, but neither the text nor the background for the TextView.

I have also tried getting rid of the RelativeLayout and calling the layout method on the TextView. I haven't been able to get this to work, however, because the text is only horizontally, and not vertically, aligned after I set the gravity on the TextView.

1 answers

0

Во- первых - Пользовательские представления должны распространяться какие - то View.class. Класс продлить должно быть все , что ваша точка зрения корень в вашем xml.


Во- вторых - Вы держите ссылку на containerLayout(вид корня) , который является излишним. Этот класс является видом корня.

Заменить containerLayoutс thisили просто удалив полностью:

textView = (TextView) findViewById(R.id.centered_text_view_text);

В- третьих - я не могу сказать , как вы раздувания это неправильно, но я никогда не делал это так.

Вместо вызова layoutна containerLayout, попробуйте накачивание с inflate()методом. (Вы получаете доступ к этому при расширении суб класс View)

inflate(getContext(), R.layout.view_user_tag, this);

Обратите внимание на то, как я устанавливаю thisкак корень, и используя Inflater из класса представления.


Ваш класс может выглядеть как что-то вроде этого:

public static class TextInLinear extends RelativeLayout { 

     public TextView textView; 

     //region default constructers 

     public void TextInLinear(Context context){
        this(context, null);
     }

     public void TextInLinear(Context context, AttributeSet attrs){
        this(context, attrs, 0);
     }

     public void TextInLinear(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
         if(!isInEditMode()) init();
     }

     //endregion

     private void init(){
         inflate(getContext(), R.layout.view_user_tag, this);
         textView = (TextView) this.findViewById(R.id.centered_text_view_text);
     }


     /* more methods. i.e. setText(), getText() or whatever */
}