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

我正在编写一个从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);
}
280271 次浏览

试试这个:

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

问题解决了!

注:请确保使用父布局的LayoutParams。我的是LinearLayout.LayoutParams

如果您未能传递视图的高度或宽度,

Android将抛出异常。 不要创建新的LayoutParams对象,而是使用原始对象,以便保留所有其他设置的参数。请注意,GetLayoutParams返回的LayoutParams类型是父母布局的类型,而不是正在调整大小的视图的类型。

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

这对我有用:

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

值得注意的是,假设您要在与设备无关的像素DP)中调整视图的大小:-

您需要使用一个名为applyDimension的方法,它是类TypedValue的成员,以将DP转换为像素。因此,如果我想将高度设置为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()获取屏幕密度/分辨率

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

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

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

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

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

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

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

下面是来自@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();
}
}

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

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

这就是我如何做到这一点。在西莱里亚回答中,他/她执行了以下操作:

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

在Kotlin中,您可以使用KTX扩展

yourView.updateLayoutParams {
height = <YOUR_HEIGHT>
}

我是这样做的:

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

如果存在此视图所属的视图组,则可能还需要调用YourViewGroup.requestLayout()才能使其生效。

使用Kotlin和DP单元:

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

在Kotlin中是这样做的:

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)
fun View.setSize(width: Int, height: Int) {
updateLayoutParams {
this.width = width
this.height = height
}
}