22 votes

Exception de pointeur nul lors de l'appel d'une mesure sur un modèle gonflé

J'ai donc une mise en page qui est un fichier séparé, que je gonfle. Ensuite, je modifie mes vues de texte et mon image dans ma mise en page, et j'appelle la mesure, mais j'obtiens un pointeur nul lorsque j'essaie de mesurer la mise en page. Je n'arrive pas à comprendre pourquoi. J'essaie de convertir la mise en page en une image bitmap.

View inflatedView  = ((Activity)getContext()).getLayoutInflater().inflate(R.layout.my_layout, null);

inflatedView.measure(getWidth(), getHeight());
inflatedView.layout(0, 0, inflatedView.getMeasuredWidth(),inflatedView.getMeasuredHeight());
Bitmap viewAsImage = Bitmap.createBitmap(inflatedView.getWidth(), inflatedView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas viewCanvas = new Canvas(viewAsImage);

Voici le fichier XML

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:layout_gravity="bottom"
    android:id="@+id/my_layout"
    android:background="@color/transparent_black">
    <ImageView android:id="@+id/image_left"
        android:layout_width="48dip" android:layout_height="48dip"
        android:layout_centerVertical="true" android:layout_alignParentLeft="true"
        android:scaleType="fitXY" android:maxWidth="48dip" android:maxHeight="48dip"
        android:padding="5dip" />
    <ImageView android:id="@+id/image_right"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_marginRight="20dip" android:src="@drawable/arrow"
        android:layout_centerVertical="true" android:scaleType="fitXY"
        android:maxWidth="48dip" android:maxHeight="48dip"
        android:layout_alignParentRight="true" />
    <TextView android:paddingLeft="4dip" android:paddingRight="1dip"
        android:layout_width="wrap_content"         android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image_left"
        android:layout_toLeftOf="@id/image_right"       android:id="@+id/some_name"
        android:maxLines="1" android:ellipsize="end" android:textSize="20sp"
        android:textColor="@color/white"
                    android:layout_centerVertical="true"
        android:textStyle="normal" />
</RelativeLayout>

À la ligne measure(), il lance un pointeur nul, et j'ai vérifié que getWidth et getHeight donnent des valeurs légitimes.

Des idées ?

Merci !

1voto

J'y remédie en ajoutant de l'eau :

view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth,desiredHeight));

à la vue avant de la renvoyer par InfoWindowAdapter.getInfoWindow

(d'après : https://stackoverflow.com/a/15750783/4291264 )

1voto

MohanRaj Points 193

Je viens de découvrir qu'en testant l'appareil ou l'émulateur Android version < 4.4, cela génère une exception de type nullpointer. La modification de la mise en page par une mise en page linéaire résoudra le problème.
Code :

<LinearLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom"
    android:background="@color/transparent_black">

    <ImageView android:id="@+id/image_left"
        android:layout_width="48dip" 
        android:layout_height="48dip"
        android:layout_centerVertical="true"      
        android:layout_alignParentLeft="true"
        android:scaleType="fitXY"
        android:maxWidth="48dip"
        android:maxHeight="48dip"
        android:padding="5dip" />
    <ImageView android:id="@+id/image_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="20dip"
        android:src="@drawable/arrow"
        android:layout_centerVertical="true"
        android:scaleType="fitXY"
        android:maxWidth="48dip"
        android:maxHeight="48dip"
        android:layout_alignParentRight="true" />
    <TextView android:paddingLeft="4dip"
        android:paddingRight="1dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/image_left"
        android:layout_toLeftOf="@id/image_right"
        android:id="@+id/some_name"
        android:maxLines="1"
        android:ellipsize="end"
        android:textSize="20sp"
        android:textColor="@color/white"
        android:layout_centerVertical="true"
        android:textStyle="normal" />
</RelativeLayout>

0voto

namezhouyu Points 206

Changer

View inflatedView  = ((Activity)getContext()).getLayoutInflater().inflate(R.layout.my_layout, null);

Pour

View inflatedView  = ((Activity)getContext()).getLayoutInflater().inflate(R.layout.my_layout, null,false);
 inflatedView.setLayoutParams(new RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT,
          RelativeLayout.LayoutParams.WRAP_CONTENT));

Si crash lors de l'invocation de la méthode view.measure() en utilisant l'api sous Android 4.3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X