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
- ¿Cómo convertir la fecha del calendario en cadena?
- Android: casilla de verificación que se repite cada 10º en un listview
- Android Spinner utilizando ArrayList <String>
- Android: error al cargar la biblioteca
- Android Pay: Public, Generación de pares de claves privadas (Curva elíptica con NISTP-256)
<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!
- Android.support.v7.widget.AppCompatTextView no se puede convertir en android.widget.RelativeLayout
- Medir el área de polígono irregular en android
- Retrofit GSON serialize Fecha de json string en java.util.date
- AsyncTask con rotación de pantalla - onRetainNonConfigurationInstance obsoleta
- Activo de fuente no encontrado helvetica.ttf en lollipop
- Android dinámicamente añadir elemento de la disposición xml
- ¿Cómo diferenciar entre un fling y un toque?
- Android - Parse JS generó urls con JSOUP
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
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>
- ¿Cómo se restablece el servicio de WhatsApp incluso si debo detener la aplicación?
- Mostrar todos los elementos de AutocompleteTextView sin escribir texto