Android View.getDrawingCache returns null, only null

AndroidAndroid View

Android Problem Overview


Would anyone please try to explain to me why

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

ALWAYS logs that the drawing cache is null, and sets the bitmap to null?

Do I have to actually draw the view before the cache is set?

Thanks!

Android Solutions


Solution 1 - Android

I was having this problem also and found this answer:

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

Solution 2 - Android

if getDrawingCache is always returning null guys: use this:

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

Reference: https://stackoverflow.com/a/6272951/371749

Solution 3 - Android

The basic reason one gets nulls is that the view is not dimentioned. All attempts then, using view.getWidth(), view.getLayoutParams().width, etc., including view.getDrawingCache() and view.buildDrawingCache(), are useless. So, you need first to set dimensions to the view, e.g.:

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

(You have already set 'width' and 'height' as you like or obtained them with WindowManager, etc.)

Solution 4 - Android

Im using this instead.

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

Solution 5 - Android

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

Solution 6 - Android

If the view you want catch really shows on screen, but it return null. That means you catch the view before Window manager generate it. Some layouts are very complicated. If layout includes nested layouts, layout_weight..etc, it causes several times relayout to get exactly size. The best solution is waiting until window manager finish job and then get screen shot. Try to put getDrawingCache() in handler.

Solution 7 - Android

@cV2 and @nininho's answers both work for me.

One of the other reasons that i found out the hard way was that the view that i had was generating a view that has width and height of 0 (i.e. imagine having a TextView with a string text of an empty string). In this case, getDrawingCache will return null, so just be sure to check for that. Hope that helps some people out there.

Solution 8 - Android

I am trying to creating the n number of images dynamically based on view.

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);
    }
} catch (WriterException e) {
    e.printStackTrace();
}

I think this code will help someone..

Solution 9 - Android

The error may be bacause your View too large to fit into drawing cache.

I got the explanation of my "View.getDrawingCache returns null" problem from my logs:

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

Android docs also says: Android devices can have as little as 16MB of memory available to a single application. That is why you can not load big bitmap.

Solution 10 - Android

This the simple and efficient way to get bitmap

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBexView Question on Stackoverflow
Solution 1 - AndroidMarcio CovreView Answer on Stackoverflow
Solution 2 - AndroidcV2View Answer on Stackoverflow
Solution 3 - AndroidApostolosView Answer on Stackoverflow
Solution 4 - AndroidTyroView Answer on Stackoverflow
Solution 5 - AndroidAlexey KurilovView Answer on Stackoverflow
Solution 6 - AndroidKislingkView Answer on Stackoverflow
Solution 7 - AndroidBundeeteddeeView Answer on Stackoverflow
Solution 8 - AndroidHarishView Answer on Stackoverflow
Solution 9 - AndroidYuliia AshomokView Answer on Stackoverflow
Solution 10 - AndroidNilesh BView Answer on Stackoverflow