Excepción de puntero nulo al llamar a la medida en el diseño inflado

Así que tengo un diseño que es un archivo separado, por lo que lo inflar. A continuación, cambiar las vistas de texto y la imagen en mi diseño, y la medida de llamada, pero me sale un puntero nulo cuando intento medir el diseño. No puedo por la vida de mí entender por qué esto es. Estoy tratando de convertir el diseño a un mapa de bits con el tiempo.

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í está 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 línea measure (), lanza un puntero nulo, y he verificado que getWidth y getHeight están dando valores legítimos.

¿Algunas ideas?

¡Gracias!

measure() lanza la Null Pointer Exception porque cuando inflas tu diseño no leerá las propiedades de ancho de la altura del diseño.

Simplemente agregue esta línea antes de llamar a 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; } 

El nivel superior RelativeLayout parece asustarse en la medida sin límites. Establecer límites explícitos en la vista inflada antes de llamar a medida:

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

Inflater no extrae los layout_width y layout_height cuando no asigna su padre como argumento en el método LayoutParams , así que intenta establecer LayoutParams con el ancho y la altura especificados y luego la medida de llamada.

No sé por qué se está inflando a mano, y por qué desea guardar una imagen de la misma. Pero estoy haciendo casi lo mismo en un diseño complejo para un widget de 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(); 

Mientras que encontré que el ajuste de los parámetros de diseño (como en varias otras respuestas) arregló mi problema, la solución que usé terminó siendo que las opiniones se inflaron 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 en realidad había un padre y los parámetros de diseño del padre podría ser utilizado y respetado.

Lo soluciono con la adición de:

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

A la vista antes de devolverlo desde InfoWindowAdapter.getInfoWindow

(Desde: https://stackoverflow.com/a/15750783/4291264 )

Acabo de descubrir que el dispositivo de prueba o el emulador android versión <4.4 esto genera una excepción nullpointer. Cambiar el diseño con un lineal resolverá el problema. Aquí he cambiado su 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> 

  • Quiero crear un "modo nocturno" rojo para mi aplicación para Android
  • ¿Cómo parse la fecha en Java? cierta confusión en los formatos de fecha
  • Buscando la implementación de DiskLruCache en la fuente ICS
  • Hacer una conexión HTTPS mediante URL.openConnection ()
  • obteniendo 505 de respuesta desde el servidor
  • Serializar objeto personalizado que contiene objetos JodaTime en JSON
  • Ordenar por atributo de entidad extranjera en ORMLite
  • Dentro de OnClickListener No puedo tener acceso a muchas cosas - cómo acercarme?
  • ¿Cómo puedo establecer el ámbito predeterminado en IntelliJ 12 para encontrar usos?
  • ¿En qué se utilizan las clases PreferenceManager y SharedPreference en Android?
  • ¿Cómo acceder / carpeta de datos de otra aplicación a través de su aplicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.