Comment redimensionner une vue personnalisée par programme?

Je code une vue personnalisée, étendue depuis RelativeLayout, et je veux la redimensionner par programmation, comment puis-je le faire?

la vue personnalisée Class quelque chose comme:

public ActiveSlideView(Context context, AtsortingbuteSet attr){ super(context, attr); LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(inflater != null){ inflater.inflate(R.layout.active_slide, this); } 

Android lève une exception si vous manquez de dépasser la hauteur ou la largeur d’une mise en page. Au lieu de créer un nouvel object LayoutParams, utilisez celui d’origine de la vue, ainsi tous les autres parameters définis sont conservés:

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

Problème résolu!

REMARQUE: Veillez à utiliser LayoutParams du LayoutParams . Le mien est LinearLayout.LayoutParams !

Cela fonctionne pour moi:

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

Pour ce que cela vaut, supposons que vous vouliez redimensionner la vue en pixels indépendants du périphérique ( dp ): –

Vous devez utiliser une méthode appelée applyDimension , membre de la classe TypedValue pour convertir des pixels en dps. Donc, si je veux régler la hauteur à 150dp (disons) – alors je pourrais le faire:

 float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMesortingcs()); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) someLayout.getLayoutParams(); params.height = (int) pixels; someLayout.setLayoutParams(params); 

où l’expression: getResources().getDisplayMesortingcs() obtient la densité / résolution de l’écran

Voici une version plus générique de la solution ci-dessus 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(); } } 

essayez ceci:

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

J’ai utilisé cette façon pour augmenter la largeur de la vue personnalisée

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

Je l’ai résolu de cette façon .. J’ai fondamentalement une vue simple dans le fichier XML.

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

Si vous n’avez que two or three condition(sizes) vous pouvez utiliser @Overide onMeasure comme

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

Et changez facilement votre taille pour ces conditions dans la classe CustomView.

Si vous ne onMeasure pas compte de onMeasure , n’oubliez pas de mettre à jour les nouvelles tailles

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