MarginLayoutParams.setMargins() не работает?

Вот в чем дело: я хочу добавить некоторые изображения программно. Изображения должны иметь topMargin из 5dip, за исключением первого изображения, в LinearLayout с vertical orientation образом. под сегментом кода:

LinearLayout body = (LinearLayout) findViewById(R.id.body);

    for (int i = 1; i <= 4; i++) {

        ImageView img = new ImageView(this);
        MarginLayoutParams lp = new MarginLayoutParams(-2, -2);

        img.setImageResource(R.drawable.image);
        if (i != 1) {

            lp.setMargins(0, 5, 0, 0);

        }
        img.setLayoutParams(lp);

        body.addView(img);
        body.requestLayout();
    }

Запустив программу, я вижу 4 изображения (здесь), выровненные по вертикали одно за другим, но topMargin (как в коде, 5dip) нет. body является id из LinearLayout. вот сегмент XML для:

<LinearLayout
            android:id="@+id/body"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#901b0e08"
            android:orientation="vertical"
            android:paddingLeft="6dp"
            android:paddingRight="8dp" >
 </LinearLayout>

Я не могу понять, что здесь пошло не так.

Спасибо.


person IronBlossom    schedule 21.11.2011    source источник


Ответы (3)


Попробуйте изменить MarginLayoutParams на это:

LayoutParams lp = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT );

Причина этого заключается в том, что body является LinearLayout, и поэтому вы хотели бы использовать LayoutParams, специфичный для LinearLayout.

person kaspermoerch    schedule 21.11.2011

Попробуйте установить padding, но margin для ImageView. Иногда работает нормально. Вы можете напрямую установить размер заполнения для ImageView без объявления LayoutParams.

person Takol    schedule 21.11.2011

Возможно, вам потребуется установить свойство LayoutParams gravity, например:

    lp.gravity = 0; //AXIS_X_SHIFT 

Это то, что отлично работает для меня.

person Narcís Calvet    schedule 21.11.2011
comment
У меня была проблема, когда установка полей для FrameLayout работала в OS 4.x, но, похоже, не действовала в 2.3. Установка lp.gravity = Gravity.NO_GRAVITY исправила проблему на 2.3 - person mwk; 09.06.2013