¿Cómo cambiar el tamaño de una vista personalizada mediante progtwigción?

Estoy codificando una vista personalizada, extendida desde RelativeLayout, y quiero redimensionarla programáticamente, ¿Cómo puedo hacer?

la clase de vista personalizada es algo así como:

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 arroja una excepción si omite pasar el alto o el ancho de un diseño. En lugar de crear un nuevo objeto LayoutParams, use el original de view, de esa forma se conservan todos los demás parámetros:

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

¡Problema resuelto!

NOTA: asegúrese de usar los LayoutParams del Layout padre. ¡El mío es LinearLayout.LayoutParams !

Esto funciona para mí:

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

Por lo que vale, digamos que quería cambiar el tamaño de la vista en píxeles independientes del dispositivo ( dp ):

Necesita usar un método llamado applyDimension , que es un miembro de la clase TypedValue para convertir de píxeles a dps. Entonces, si quiero establecer la altura en 150dp (decir) – entonces podría hacer esto:

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

donde la expresión: getResources().getDisplayMetrics() obtiene la densidad / resolución de la pantalla

Aquí hay una versión más genérica de la solución anterior de @herbertD:

 private void resizeView(View view, int newWidth, int newHeight) { try { Constructor ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); view.setLayoutParams(ctor.newInstance(newWidth, newHeight)); } catch (Exception e) { e.printStackTrace(); } } 

prueba uno este:

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

Utilicé esta forma para boost el ancho de la vista personalizada

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

Lo resolví de esta manera … básicamente tengo una vista simple dentro del archivo xml.

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

Si solo tiene two or three condition(sizes) entonces puede usar @Overide onMeasure como

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

Y cambie su tamaño para estas condiciones en la clase CustomView fácilmente.

si está anulando onMeasure , no se olvide de actualizar los nuevos tamaños

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