web-dev-qa-db-fra.com

Comment redimensionner une vue personnalisée par programme?

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);
        }
144
herbertD
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!

113
herbertD

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

Cela fonctionne pour moi:

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

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

41
Danield

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

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

essayez un celui-ci:

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

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;
4
DazzleGifts Apps

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.

2
Xar-e-ahmer Khan

si vous écrasez onMeasure, n'oubliez pas de mettre à jour les nouvelles tailles

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

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();
0
ClassA