verificar variable validar una saber objeto nulo igual evaluar ejemplo como campo java android android-layout

validar - variable igual a null en java



Excepción de puntero nulo al llamar a la medida en un diseño inflado (8)

Así que tengo un diseño que es un archivo separado, así que lo inflo. Luego cambio las vistas de texto y la imagen en mi diseño, y llamo a medir, pero me sale un puntero nulo cuando intento medir el diseño. No puedo, por mi vida, averiguar por qué es esto. 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!


Acabo de descubrir que la versión de Android del emulador o dispositivo de prueba <4.4 esto genera una excepción de punto nulo. 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>


Cambio

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

A

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 falla al invocar el método view.measure () utilizando la API debajo de Android 4.3


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

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


Lo soluciono agregando:

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

a la vista antes de devolverlo desde InfoWindowAdapter.getInfoWindow

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


No sé por qué estás inflando a mano, y por qué quieres guardar una imagen de ella. 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();


Si bien descubrí que la configuración de los parámetros de diseño (como en otras respuestas) solucionó mi problema, la solución que utilicé fue que las vistas estaban infladas.

inflater.inflate(layoutId, null);

en lugar de

inflater.inflate(layoutId, parent, false);

Esto fue 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 podían usarse y respetarse.


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


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

Solo agregue esta línea antes de llamar a view.measure() dependiendo del tipo de diseño que esté usando

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