studio setvisibility requestfocus example clase android android-view

setvisibility - Android View.getDrawingCache devuelve nulo, solo nulo



view android studio (10)

¿Alguien podría tratar de explicarme por qué?

public void addView(View child) { child.setDrawingCacheEnabled(true); child.setWillNotCacheDrawing(false); child.setWillNotDraw(false); child.buildDrawingCache(); if(child.getDrawingCache() == null) { //TODO Make this work! Log.w("View", "View child''s drawing cache is null"); } setImageBitmap(child.getDrawingCache()); //TODO MAKE THIS WORK!!! }

¿SIEMPRE registra que la memoria caché de dibujo es nula y establece el mapa de bits como nulo?

¿Tengo que dibujar realmente la vista antes de que se establezca la caché?

¡Gracias!


El error puede deberse a que su Vista es demasiado grande para caber en la memoria caché de dibujo .

Obtuve la explicación de mi problema "View.getDrawingCache returns null" de mis registros:

W/View: View too large to fit into drawing cache, needs 19324704 bytes, only 16384000 available

Los documentos de Android también says : los dispositivos Android pueden tener tan solo 16 MB de memoria disponible para una sola aplicación. Es por eso que no se puede cargar un gran mapa de bits.


Esta es la forma simple y eficiente de obtener un mapa de bits

public void addView(View v) { v.setDrawingCacheEnabled(true); v.buildDrawingCache(); Bitmap bitmap = v.getDrawingCache(); if(bitmap == null) { // bitmap is null // do whatever you want } else { setImageBitmap(bitmap); } v.setDrawingCacheEnabled(false); v.destroyDrawingCache(); }


Estaba teniendo este problema también y encontré esta respuesta:

v.setDrawingCacheEnabled(true); // this is the important code :) // Without it the view will have a dimension of 0,0 and the bitmap will be null v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); v.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); v.setDrawingCacheEnabled(false); // clear drawing cache


Estoy usando esto en su lugar.

myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache()); } });


Intento crear el n número de imágenes dinámicamente según la vista.

LayoutInflater infalter=(LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View addview=infalter.inflate(R.layout.barcode_image_list_row_item, null); final ImageView imv=(ImageView) addview.findViewById(R.id.imageView1); final TextView tv=(TextView) addview.findViewById(R.id.textView1); try { final Bitmap bitmap = encodeAsBitmap(""+value, BarcodeFormat.CODE_128, 600, 300); if(bitmap !=null){ // TODO Auto-generated method stub imv.setImageBitmap(bitmap); tv.setText(value); addview.setDrawingCacheEnabled(true); // this is the important code :) // Without it the view will have a dimension of 0,0 and the bitmap will be null addview.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); addview.layout(0, 0, addview.getMeasuredWidth(), addview.getMeasuredHeight()); addview.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(addview.getDrawingCache()); addview.setDrawingCacheEnabled(false); // clear drawing cache // saving the bitmap savebarcode(b,value); }else{ } } catch (WriterException e) { e.printStackTrace(); }

Creo que este código ayudará a alguien ...


La razón básica por la que uno obtiene nulos es que la vista no está dimensionada. Todos los intentos, utilizando view.getWidth (), view.getLayoutParams (). Width, etc., incluyendo view.getDrawingCache () y view.buildDrawingCache (), son inútiles. Por lo tanto, primero debe establecer las dimensiones de la vista, por ejemplo:

view.layout(0, 0, width, height);

(Ya ha configurado ''ancho'' y ''alto'' a su gusto u obtenido con WindowManager, etc.)


Las respuestas de @cV2 y @ nininho funcionan para mí.

Una de las otras razones que descubrí por el camino difícil fue que la vista que tenía era generar una vista que tenía ancho y alto de 0 ( es decir, imaginar tener un TextView con un texto de cadena de una cadena vacía ). En este caso, getDrawingCache devolverá nulo, así que asegúrese de verificarlo. Espero que ayude a algunas personas por ahí.


Si la vista que desea capturar realmente se muestra en la pantalla, pero devuelve nulo. Eso significa que captas la vista antes de que Window manager la genere. Algunos diseños son muy complicados. Si el diseño incluye diseños anidados, layout_weight..etc, provoca varias veces que relayout obtenga exactamente el tamaño. La mejor solución es esperar hasta que el administrador de ventanas termine el trabajo y luego obtener una captura de pantalla. Intenta poner getDrawingCache () en el controlador.


Trabaja mejor 4me

Bitmap bitmap = Bitmap.createBitmap( screen.getMeasuredWidth(), screen.getMeasuredHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); screen.layout(0, 0, screen.getMeasuredWidth(), screen.getMeasuredHeight()); screen.draw(canvas);


si getDrawingCache siempre returning null chicos returning null : usa esto:

public static Bitmap loadBitmapFromView(View v) { Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); v.draw(c); return b; }

Referencia: https://.com/a/6272951/371749