Textview внутри RelativeLayout в пользовательском представлении неправильно применяет гравитацию?

Итак, у меня есть установка, в которой я создаю свой собственный View и добавляю в него TextView. Однако для этого нарушена гравитационная установка. (Он центрируется по горизонтали, но не по вертикали). Я делаю это так, потому что есть и другие вещи, которые я рисую в моем представлении, помимо TextView, но они работают нормально. Проблема только в гравитации TextView. Вот частичный код того, что у меня есть.

public class myView extends View {

    protected RelativeLayout baseLayout;
    protected TextView textView1;
    protected TextView textView2;

    public myView (Context context) {
        super(context);
        setLayoutParams(new LayoutParams(FILL_PARENT, FILL_PARENT));

        baseLayout = new RelativeLayout(context);
        baseLayout.setLayoutParams(new LayoutParams(FILL_PARENT, FILL_PARENT));

        textView1 = new TextView(context);
        // initialize textView1 string, id, textsize, and color here
        textView2 = new TextView(context);
        // initialize textView2 string, id, textsize, and color here

        baseLayout.addView(textView1);
        baseLayout.addView(textView2);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Resources res = getResources();
        // calculate out size and position of both textViews here
        textView1.layout(left1, top1, left1 + width1, top1 + height1);
        textView1.setGravity(Gravity.CENTER);
            textView1.setBackgroundColor(green); // just to make sure it's drawn in the right spot
        textView2.layout(left2, top2, left2 + width2, top2 + height2);
        textView2.setGravity(Gravity.CENTER);
            textView2.setBackgroundColor(blue); // same as above

        baseLayout.draw(canvas);
    }
}

Это рисует TextView в точных точках и размерах, которые мне нужны (я знаю из-за цвета фона), но гравитация устанавливает их только по центру по горизонтали ... а не по вертикали. (да, TextView больше, чем фактические текстовые строки)

Я мог бы ВЕРОЯТНО реализовать найденное здесь решение (TextView gravity), но это не кажется очень эффективным или надежный способ обойти это. Что-то я делаю неправильно, из-за чего гравитация перестает работать правильно? Любой ввод / помощь приветствуются.


person Joishi Bodio    schedule 03.06.2011    source источник
comment
Две вещи: 1. Я не понимал, что View может содержать ViewGroup? 2. Зачем использовать RelativeLayout, когда позиции дочерних представлений задаются абсолютно?   -  person samis    schedule 28.09.2012
comment
Неважно, 1, я не понимал, что ViewGroup расширенный View !!   -  person samis    schedule 28.09.2012
comment
Прошло некоторое время с тех пор, как я опубликовал это, но если я правильно помню - AbsoluteLayout требовал разных аргументов конструктора, и было просто проще использовать RealtiveLayout .. Но это могло быть неточно. : / В любом случае - вы можете захотеть, чтобы некоторые позиции обзора были относительными, а некоторые - абсолютными - кто знает, что вы могли запланировать. По крайней мере, у вас будет вариант с относительной компоновкой. :)   -  person Joishi Bodio    schedule 08.10.2012


Ответы (3)


Хорошо .. Итак, я понял это. Мне просто нужно было запустить метод measure () для каждого TextView. Итак, мой новый код выглядит так:

    textView1.measure(MeasureSpec.makeMeasureSpec(width1, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height1, MeasureSpec.EXACTLY));
    textView1.layout(left1, top1, left1 + width1, top1 + height1);
    textView1.setGravity(Gravity.CENTER);

    textView2.measure(MeasureSpec.makeMeasureSpec(width2, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height2, MeasureSpec.EXACTLY));
    textView2.layout(left2, top2, left2 + width2, top2 + height2);
    textView2.setGravity(Gravity.CENTER);

Теперь он центрируется как по горизонтали, так и по вертикали, как и должно быть. Если у вас такие же проблемы, попробуйте это.

person Joishi Bodio    schedule 03.06.2011
comment
другой способ - WRAP_CONTENT в TextView и изменить родительское выравнивание (Gravity.CENTER) или alignParent .. - person Hugo Gresse; 06.03.2015

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

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

Взгляните на Как сделать Я центрирую текст по горизонтали и вертикали в TextView на Android?

person Adil Soomro    schedule 03.06.2011
comment
На самом деле это то, что у меня было изначально, прежде чем я заметил, что просто CENTER был вариантом (побитовое или комбинация вертикального и горизонтального) .. Это не решит эту проблему. Однако я понял это. (размещено ниже) - person Joishi Bodio; 04.06.2011

Я тоже столкнулся с этой проблемой. Моя проблема заключалась в том, что когда я устанавливаю гравитацию в TextView, вызывая TextView.setGravity (), она незаметно влияет на макет самого себя (Textview) в родительском представлении.

Вот что я сделал для обходного пути:

TextView schedule = getBubbleTextView (item, hasZeroSpanEvent);
// There's a bug in TextView, we need to use wrapper to fix it   
LinearLayout wrapper = new LinearLayout (getApplicationContext ());
wrapper.addView (schedule); 
hourlyBubbleParent.addView (wrapper, llp);

Вы должны уловить идею, что вы должны использовать оболочку, чтобы обойти это.

person Harry    schedule 27.05.2013
comment
Я счастлив, что некоторые из моих вопросов все еще оказываются полезными почти через 2 года после того, как я их задал ... ^. ^ Если у меня снова возникнет эта проблема, я рассмотрю этот подход - мне интересно, это та же версия ОС Android , однако, или если проблема все еще существует даже с более новыми версиями API. (Думаю, в то время я кодировал API 7 ... могло быть 9) - person Joishi Bodio; 31.05.2013