我正在编写一个自定义视图,从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);
}
答案 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)
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()使其生效。