2011-05-09 9 views
21

Tengo un diseño que es un archivo separado, por lo que lo inflaré. Luego cambio mis vistas de texto e imagen en mi diseño, y call measure, pero obtengo un puntero nulo cuando intento medir el diseño. No puedo entender por qué esto es así. Intento convertir el diseño en un mapa de bits eventualmente.Excepción de puntero nulo al realizar una llamada medida en el diseño inflado

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

Aquí es el 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> 

En la medida() de la línea, que arroja un puntero nulo, y he verificado que getWidth y getHeight están dando valores legítimos.

¿Alguna idea?

Gracias!

+0

nos dan el xml, bonito por favor :) – Dan

+0

Por favor, publique su logcat y el xml, quizás estos pueden explicar aún más el error. – JoxTraex

+0

¿se aseguró de que 'inflatedLayout' no sea nulo? – MByD

Respuesta

37

measure() arroja Null Pointer Exception porque cuando se infla el diseño, no se leerán las propiedades de altura de ancho de disposición.

Apenas añada esta línea antes de llamar view.measure() dependiendo del tipo de diseño que está utilizando

v.measure (MeasureSpec.makeMeasureSpec (0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec (0, MeasureSpec.UNSPECIFIED));

public Bitmap getBitmapFromView(RelativeLayout v) { 
     v.setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); 
     v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
     v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 
     Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

     Canvas c = new Canvas(b); 
     v.draw(c); 
     return b; 
    } 
+2

thaaanks mucho ... me costó mucho tiempo darme cuenta :) – cV2

+0

Esta solución no funciona para todos los dispositivos. Terminé pasando a un padre al inflar la vista. –

+0

@MuhammadBabar vea esto, por favor http://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener.html –

1

No sé por qué se está inflando a mano y por qué quiere guardar una imagen. Pero estoy haciendo casi lo mismo en un diseño complejo para un widget pantalla de inicio, y esto es lo que hago:

LayoutInflater inflater = LayoutInflater.from(context); 
View content = inflater.inflate(layoutId, null); 
int measuredWidth = View.MeasureSpec.makeMeasureSpec(widgetWidth, View.MeasureSpec.EXACTLY); 
int measuredHeight = View.MeasureSpec.makeMeasureSpec(widgetHeight, View.MeasureSpec.EXACTLY); 
content.measure(measuredWidth, measuredHeight); 
content.layout(0, 0, content.getMeasuredWidth(), content.getMeasuredHeight()); 
Bitmap bitmap = Bitmap.createBitmap(widgetWidth, widgetHeight, Config.ARGB_8888); 
Canvas canvas = new Canvas(bitmap); 
File file = new File(bitmapCacheFileName);    
file.createNewFile(); 
FileOutputStream ostream = new FileOutputStream(file); 
bitmap.compress(CompressFormat.PNG, 100, ostream); 
ostream.close(); 
+0

Todavía obtengo una excepción de puntero nulo: \ – rozap

+0

¿Con mi código? ¿Dónde obtienes la NullPointerException? ¿En qué línea? – Kaj

+0

Consulte este código completo, esto no arrojará NullPointerException http://stackoverflow.com/a/11047006/185022 –

11

Inflater no extrae layout_width y layout_height atributos cuando no se asigna como su matriz un argumento en el método inflate, intente configurar LayoutParams con ancho y alto especificados y luego call measure.

33

El nivel superior RelativeLayout parece al monstruo hacia fuera en la medida sin límites. Establecer límites explícitos en la vista de inflado antes de llamar a medida:

v.setLayoutParams(new ViewGroup.LayoutParams(0,0)); 
+0

gracias, esto funcionó para mí –

+2

Estaba recibiendo el mismo problema en Galaxy S3, pero no en Nexus 5,4 y Galaxy S4. Y esto solución funcionó para mí. Gracias –

+0

esto también está funcionando ... –

1

Mientras me pareció que la fijación de los parámetros de diseño (como en varias otras respuestas) hizo arreglar mi problema, la solución utilicé terminó siendo que las opiniones fueron inflados con

inflater.inflate(layoutId, null); 

en lugar de

inflater.inflate(layoutId, parent, false); 

Esto era más correcto para mi caso de uso ya que no era en realidad uno de los padres y de los parámetros de diseño de la matriz podría ser usado y respetado.

1

que fijarlo con la adición:

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

a la vista antes de devolverlos de InfoWindowAdapter.getInfoWindow

(a partir de: https://stackoverflow.com/a/15750783/4291264)

1

acabo de enterar que dispositivo de prueba o un emulador de Android versión 4.4 < Esto genera una excepción NullPointer. Cambiar el diseño con uno lineal resolverá el problema. Aquí cambié tu código.
Código:

<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> 

0

Cambio

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

Para

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 accidente mientras invoki ng método view.measure() utilizando la API a continuación 4.3

Cuestiones relacionadas