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



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

11 ответов:

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

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

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

Примечание: обязательно используйте Родительский макет LayoutParams. Мой-это LinearLayout.LayoutParams!

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

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

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

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

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

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

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

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;
                            }
                        });

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

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

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

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

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

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

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

вот как я этого добился. В 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();

Comments

    Ничего не найдено.