para - manual de programacion android pdf
¿Cómo cambiar el tamaño de una vista personalizada mediante programación? (10)
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);
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);
}
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<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class);
view.setLayoutParams(ctor.newInstance(newWidth, newHeight));
} catch (Exception e) {
e.printStackTrace();
}
}
Esto funciona para mí:
ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();
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;
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
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.
Utilicé esta forma para aumentar 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;
}
});
prueba uno este:
...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);
si está anulando onMeasure
, no se olvide de actualizar los nuevos tamaños
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(newWidth, newHeight);
}
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
!