如何以编程方式调整自定义视图的大小?
我正在编写自定义视图,从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); }
如果您错过传递布局的高度或宽度,Android会引发exception。 而不是创build一个新的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);
其中expression式: getResources().getDisplayMetrics()
获取屏幕密度/分辨率
试试这个:
... View view = inflater.inflate(R.layout.active_slide, this); view.setMinimumWidth(200);
以下是来自@herbertD的更通用的解决scheme:
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(); } }
我用这种方式来增加自定义视图的宽度
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)
那么你可以使用@Overide onMeasure
@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); }