Android: использование LayoutParams для установки ширины объекта View - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть элемент пользовательского интерфейса, с которым я работаю в моем приложении Android, который имеет пользовательскую ширину.Элемент пользовательского интерфейса, по сути, представляет собой блок с двумя зелеными кружками - один кружок слева от блока, а другой кружок справа от блока.

Я хочу иметь возможность программно устанавливать ширину всего элемента пользовательского интерфейса.Круги всегда должны иметь постоянный размер, а затем блок, расположенный посередине, должен иметь размер, чтобы заполнить оставшееся пространство.

Вот что у меня сейчас есть:

<?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"
    android:orientation="horizontal" >

    <View
        android:background="@drawable/green_circle"
        android:id="@+id/left_green_circle"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal"
    />

    <View
        android:background="@drawable/blue_rectangle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal" 
    />

    <View
        android:background="@drawable/green_circle"
        android:id="@+id/right_green_circle"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_weight="1"
        android:layout_gravity="center_horizontal"
    />

</LinearLayout>

Затем я устанавливаю параметры макета просмотра в коде так:

int layoutLeft = block_x_position - green_circle_width;
int layoutWidth = block_width + (green_circle_width * 2);

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(layoutWidth, block_height);
layoutParams.setMargins(layoutLeft, block_y_position, 0, 0);
this.setLayoutParams(layoutParams);

this.requestLayout();

Я использую RelativeLayoutв приведенном выше коде, потому что родительским элементом всего этого элемента View является RelativeLayout.К сожалению, я не получаю ожидаемых результатов.Моя переменная "block_width" - "40dp", а моя переменная "green_circle_width" - "20dp".Вот что я получаю:

enter image description here

Я пытался использовать «wrap_content» вместо «match_parent» в моем XML для просмотра, но это никак не влияет.Любая идея, почему мой блок расширяется за ширину, которую я бы хотел увеличить?

Спасибо за любую помощь.

1 Ответ

1 голос
/ 30 декабря 2011

Вы видите обрезанные круги, потому что (я представляю) ширина изображений зеленого круга (jpg или png) превышает 20dp. Если вы хотите масштабировать зеленые круги, используйте imageView и установите атрибут scaleType.

В противном случае вы получаете именно то, что вы хотите. Выдвигая круговые представления на 20 dp, вы создаете много дополнительного пространства для блока, чтобы заполнить его. Установите правильную ширину круга или используйте scaleType, и он будет работать.

В качестве отступления, вы, вероятно, не должны использовать match_parent в качестве ширины блока (что подразумевает, что он займет всю ширину, включая пространство, которое должно быть занято кругами). Вместо этого используйте некоторую произвольную ширину (например, 0dp) и установите layout_weight равным 1.

...