Как изменить размер пользовательского представления программно? - PullRequest
152 голосов
/ 03 июня 2010

Я кодирую пользовательское представление, расширенное от 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);
        }

Ответы [ 11 ]

234 голосов
/ 10 февраля 2011

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

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);
117 голосов
/ 03 июня 2010
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

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

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

55 голосов
/ 27 марта 2013

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

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();
43 голосов
/ 05 мая 2014

Для чего стоит, скажем, вы хотели изменить размер представления в независимых от устройства пикселях ( 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() получает плотность экрана / разрешение

7 голосов
/ 07 июля 2016

Вот более общая версия решения выше @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(); 
    }
}
5 голосов
/ 06 июля 2015

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

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;
                            }
                        });
5 голосов
/ 03 июня 2010

попробуйте это:

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);
4 голосов
/ 15 марта 2016

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

 View viewname = findViewById(R.id.prod_extra);
             prodExtra.getLayoutParams().height=64;
2 голосов
/ 16 октября 2015

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

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

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

1 голос
/ 15 декабря 2016

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

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(newWidth, newHeight);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...