Je code une vue personnalisée, étendue à partir de RelativeLayout, et je souhaite la redimensionner par programme. Comment puis-je faire?
la vue personnalisée Class ressemble à quelque chose comme:
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);
}
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));
Problème résolu!
REMARQUE: veillez à utiliser la variable LayoutParams
de la disposition parent. Le mien est LinearLayout.LayoutParams
!
Android lève une exception si vous manquez la hauteur ou la largeur d'une présentation . Au lieu de créer un nouvel objet LayoutParams, utilisez celui de la vue, ainsi tous les autres paramètres définis sont conservés:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);
Cela fonctionne pour moi:
ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();
Supposons que vous souhaitiez 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 (dis), alors je pourrais le faire:
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);
où l'expression: getResources().getDisplayMetrics()
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<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class);
view.setLayoutParams(ctor.newInstance(newWidth, newHeight));
} catch (Exception e) {
e.printStackTrace();
}
}
J'ai utilisé cette méthode 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;
}
});
essayez un celui-ci:
...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);
Je l'ai résolu de cette façon .. J'ai essentiellement une vue simple à l'intérieur du fichier XML.
View viewname = findViewById(R.id.prod_extra);
prodExtra.getLayoutParams().height=64;
Si vous avez seulement 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 écrasez onMeasure
, n'oubliez pas de mettre à jour les nouvelles tailles
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(newWidth, newHeight);
}
Voici comment j'ai réalisé cela. Dans Sileria answer il/elle a fait ce qui suit:
ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();
C'est correct, mais on s'attend à ce que nous donnions la hauteur en pixels
, mais je voulais donner la dp
Je veux que la hauteur soit aussi j'ai ajouté:
public int convertDpToPixelInt(float dp, Context context) {
return (int) (dp * (((float) context.getResources().getDisplayMetrics().densityDpi) / 160.0f));
}
Donc ça va ressembler à ça:
ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = convertDpToPixelInt(50, getContext());
layout.requestLayout();