Android View.getDrawingCache возвращает null, только null

Кто-нибудь, пожалуйста, попытайтесь объяснить мне, почему

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

ВСЕГДА регистрирует, что кеш чертежа равен нулю, и устанавливает битмап в нуль?

Должен ли я нарисовать представление до того, как будет установлен кеш?

Благодаря!

У меня была эта проблема и нашла этот ответ:

 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 

Если getDrawingCache всегда returning null парней: используйте это:

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

Ссылка: https://stackoverflow.com/a/6272951/371749

Основная причина, по которой вы получаете nulls, – это то, что представление не размыто. Все попытки затем, используя view.getWidth (), view.getLayoutParams (). Width и т. Д., Включая view.getDrawingCache () и view.buildDrawingCache (), бесполезны. Итак, сначала нужно задать размеры представления, например:

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

(Вы уже установили «ширину» и «высоту» по своему усмотрению или получили их с помощью WindowManager и т. Д.)

Если вид, который вы хотите поймать, действительно отображается на экране, но возвращает значение null. Это означает, что вы поймаете представление до того, как оконный менеджер сгенерирует его. Некоторые макеты очень сложны. Если макет включает вложенные макеты, layout_weight..etc, он вызывает несколько раз ретрансляцию, чтобы получить точно размер. Лучшее решение ждет, пока оконный менеджер не закончит работу, а затем получит снимок экрана. Попробуйте поместить getDrawingCache () в обработчик.

Я использую это вместо этого.

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

Ответы @ cV2 и @ nininho работают для меня.

Одна из других причин, по которой я обнаружил трудный путь, заключалась в том, что представление, которое у меня было, порождает представление с шириной и высотой 0 ( т. Е. Представьте, что у TextView есть строковый текст пустой строки ). В этом случае getDrawingCache вернет значение null, поэтому просто убедитесь в этом. Надеюсь, что это помогает некоторым людям.

Я пытаюсь создать n число изображений динамически на основе представления.

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

Я думаю, что этот код поможет кому-то.

Ошибка может быть вызвана тем, что ваш просмотр слишком велик, чтобы вписаться в кеш- файл.

Я получил объяснение моей проблемы «View.getDrawingCache возвращает null» из моих журналов:

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

В документах Android также говорится : Android-устройства могут иметь всего 16 МБ памяти для одного приложения. Вот почему вы не можете загружать большие растровые изображения.

Лучше всего работать 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); 
Intereting Posts
Android: добавление изображения в твит с помощью Fabric, Twitter REST API и дооснащение Использование MultipartTypedOutput Как определить Nokia X Как скрыть строку состояния в Android Android AlarmManager: есть ли способ отменить ВСЕ установленные тревоги? Метод Robotium ClickOnButton (int ID) вызывает «junit.framework.AssertionFailedError: кнопка с индексом 2131034130 недоступна!» Как создать динамический ярлык приложения с помощью API ShortcutManager для Android-приложения 7.1? Как я могу получить адрес электронной почты Android Back Button и Progress Dialog Как создать ожидающее намерения внутри класса BroadcastReceiver? Узнайте, будет ли текущая деятельность в конечном итоге выполняться в конечном итоге, после того как незавершенные отделочные операции исчезнут Выявление фрагмента в действии для Android ViewManager Как убить вспомогательные действия и довести активность до стека Ошибка развертывания / установки телефона PhoneGap 3 Android Toasts получает сенсорные события на каком-то телефоне, а не на других