Проблемы с гравитацией на Android - PullRequest
2 голосов
/ 15 марта 2011

Я пытался центрировать это пользовательское представление внутри другого пользовательского представления, расширяющего LinearLayout.Все это должно быть сделано с помощью кода, потому что все это делается во время выполнения.

Я попробовал стандартный подход с установкой гравитации:

this.setGravity(Gravity.CENTER);

Это было сделано в моем классе, чтоextends LinearLayout.

Я также попробовал метод LayoutParams:

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    params.gravity = Gravity.CENTER;
    block.setLayoutParams(params);
    this.addView(block);

Это было сделано в месте, где я добавляю блок в представление (как вы можете видеть).

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

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

Попробуйте также установить вес макета:

LinearLayout.LayoutParams params =
    new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT,
        LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER_HORIZONTAL;
params.weight = 1;
this.addView(block, params);

Это (при условии, что ваша ориентация вертикальная) позволит вашему виду заполнить оставшееся пространство в линейном макете и центрировать его по горизонтали.

Я не думаю, что есть способ иметь дочерний элемент представления меньший, чем содержащая его ячейка LinearLayout.Если представление меньше, чем его «ячейка», то LinearLayout будет уменьшен, чтобы вместить его.Если вес макета приводит к росту «ячейки», то также увеличивается и содержимое представления.

Если вы действительно хотите, чтобы представление было меньше своей «ячейки» и центрировалось, оберните его в FrameLayout.Тогда вы сможете использовать центр тяжести для вашего сердца.layout_width = "fill_parent" В xml (я знаю, что вы не можете использовать это напрямую, но это проще объяснить таким образом):

<LinearLayout orientation="vertical">
    <FrameLayout layout_weight="1" layout_height="wrap_content">
        <View layout_gravity="center" layout_{width,height}="wrap_content"/>
    </FrameLayout>
        ... other views ...
</LinearLayout>

Непомеченные атрибуты макета - "fill_parent".

1 голос
/ 15 марта 2011

Взгляните на это: http://thinkandroid.wordpress.com/2010/01/14/how-to-position-views-properly-in-layouts/

По сути, android: gravity влияет на положение вещей внутри View, тогда как android: layout_gravity позиционирует View относительно его родителей.Поэтому вам нужно использовать макет гравитации , чтобы переместить весь вид.

...