Как изменить размер пользовательского представления программно?

Я кодирую пользовательский вид, расширенный из RelativeLayout, и я хочу изменить его программно, как я могу это сделать?

пользовательский класс вида выглядит примерно так:

public ActiveSlideView(Context context, AttributeSet attr){
        super(context, attr);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(inflater != null){       
            inflater.inflate(R.layout.active_slide, this);
        }

Ответ 1

this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

Проблема решена!

ПРИМЕЧАНИЕ. Обязательно используйте родительский макет LayoutParams. Мина LinearLayout.LayoutParams!

Ответ 2

Android выдает исключение, если вам не удается передать высоту или ширину вида. Вместо того, чтобы создавать новый объект LayoutParams, используйте исходный объект, чтобы сохранить все остальные установленные параметры. Обратите внимание, что тип LayoutParams, возвращаемый getLayoutParams, относится к типу родительского макета, а не к виду, размер которого вы изменяете.

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);

Ответ 3

Это работает для меня:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

Ответ 4

Для чего вам стоит изменить размер представления в независимые от устройства пиксели (dp): -

Вам нужно использовать метод applyDimension, который является членом класса TypedValue для преобразования из пикселей в dps. Поэтому, если я хочу установить высоту 150dp (скажем), тогда я мог бы сделать это:

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMetrics());
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) someLayout.getLayoutParams();
params.height = (int) pixels;
someLayout.setLayoutParams(params);

где выражение: getResources().getDisplayMetrics() получает плотность/разрешение экрана

Ответ 5

Здесь более общая версия решения выше из @herbertD:

private void resizeView(View view, int newWidth, int newHeight) { 
    try { 
        Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); 
        view.setLayoutParams(ctor.newInstance(newWidth, newHeight));   
    } catch (Exception e) { 
        e.printStackTrace(); 
    }
}

Ответ 6

попробуйте следующее:

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);

Ответ 7

Я использовал этот способ для увеличения ширины пользовательского представления

customDrawingView.post(new Runnable() {
                            @Override
                            public void run() {
                                View view_instance = customDrawingView;
                                android.view.ViewGroup.LayoutParams params = view_instance
                                        .getLayoutParams();
                                int newLayoutWidth = customDrawingView
                                        .getWidth()
                                        + customDrawingView.getWidth();
                                params.width = newLayoutWidth;
                                view_instance.setLayoutParams(params);
                                screenWidthBackup = params.width;
                            }
                        });

Ответ 8

Я решил это так. У меня есть простой вид внутри xml файла.

 View viewname = findViewById(R.id.prod_extra);
             prodExtra.getLayoutParams().height=64;

Ответ 9

Если у вас есть только two or three condition(sizes), вы можете использовать @Overide onMeasure как

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

И легко измените свой размер для этих условий в классе CustomView.

Ответ 10

если вы переопределяете onMeasure, не забудьте обновить новые размеры

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(newWidth, newHeight);
}

Ответ 11

В Kotlin вы можете использовать расширения ktx:

yourView.updateLayoutParams {
   height = <YOUR_HEIGHT>
}

Ответ 12

Вот как я этого добился. В ответе Sileria он/она сделал следующее:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

Это правильно, но мы ожидаем, что мы дадим высоту в pixels, но я хотел дать dp, я хочу, чтобы высота была, поэтому я добавил:

public int convertDpToPixelInt(float dp, Context context) {
    return (int) (dp * (((float) context.getResources().getDisplayMetrics().densityDpi) / 160.0f));
}

Так это будет выглядеть так:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = convertDpToPixelInt(50, getContext());
layout.requestLayout();