如何以编程方式调整自定义视图的大小?

时间:2010-06-03 03:28:32

标签: android resize

我正在编写一个自定义视图,从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);
        }

15 个答案:

答案 0 :(得分:231)

如果您错过了传递布局的高度或宽度,Android会抛出异常。 不使用视图的原始对象创建新的LayoutParams对象,而是保留所有其他设置参数:

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

答案 1 :(得分:116)

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

问题解决了!

注意:请务必使用父版面LayoutParams。我的是LinearLayout.LayoutParams

答案 2 :(得分:55)

这对我有用:

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

答案 3 :(得分:42)

对于它的价值,假设您想要在设备无关像素 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()获取屏幕密度/分辨率

答案 4 :(得分:9)

在Kotlin中,您可以使用ktx extensions

yourView.updateLayoutParams {
   height = <YOUR_HEIGHT>
}

答案 5 :(得分:7)

以上是来自@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 :(得分:5)

试试这个:

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

答案 7 :(得分:5)

我用这种方法来增加自定义视图的宽度

Person.greet

答案 8 :(得分:4)

我这样解决了..我基本上在xml文件中有一个简单的视图。

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

答案 9 :(得分:3)

使用Kotlin并使用dp单元:

myView.updateLayoutParams {
    val pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200f, context.resources.displayMetrics)
    height = pixels.toInt()
}

答案 10 :(得分:2)

如果您只有two or three condition(sizes),则可以使用 @Overide onMeasure

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

并轻松地在CustomView类中更改这些条件的大小。

答案 11 :(得分:1)

如果您要覆盖onMeasure,请不要忘记更新新尺寸

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

答案 12 :(得分:1)

科特林


updateLayoutParams:

val view = layoutInflater.inflate(R.layout.cell, binding.ssss, false).apply {
            id = View.generateViewId()

            updateLayoutParams { 
                height = 200
                width = 400 
            }

        }
binding.ssss.addView(view)


布局参数:

val view = layoutInflater.inflate(R.layout.cell, binding.ssss, false).apply {
            id = View.generateViewId()
            
            layoutParams.width = 200
            layoutParams.height = 200
            
        }
binding.ssss.addView(view)

附注。 Vel_daN:爱​​你所做的?。

答案 13 :(得分:0)

这就是我实现这一目标的方式。在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();

答案 14 :(得分:0)

这就是我所做的:

View myView;  
myView.getLayoutParams().height = 32;  
myView.getLayoutParams().width = 32;

如果该视图属于某个视图组,则可能还需要调用yourViewGroup.requestLayout()使其生效。