web-dev-qa-db-fra.com

Android View.getDrawingCache renvoie null, null seulement

Quelqu'un voudrait-il essayer de m'expliquer pourquoi

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

Journalise TOUJOURS que le cache de dessin est null et définit le bitmap sur null?

Dois-je réellement dessiner la vue avant que le cache ne soit défini?

Merci!

93
Bex

J'avais aussi ce problème et j'ai trouvé cette réponse:

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
233
Marcio Covre

si getDrawingCache est toujours returning null les gars: utilisez ceci:

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

Référence: https://stackoverflow.com/a/6272951/371749

58
cV2

La raison fondamentale pour laquelle on obtient des valeurs nulles est que la vue n'est pas divisée. Toutes les tentatives effectuées avec view.getWidth (), view.getLayoutParams (). Width, etc., y compris view.getDrawingCache () et view.buildDrawingCache () sont alors inutiles. Par conséquent, vous devez d’abord définir les dimensions de la vue, par exemple:

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

(Vous avez déjà défini les options 'width' et 'height' à votre guise ou obtenues avec WindowManager, etc.)

6
Apostolos

Je l'utilise plutôt.

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

Fonctionne mieux 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);
2
Alexey Kurilov

Si la vue que vous voulez capturer s'affiche vraiment à l'écran, mais renvoie null. Cela signifie que vous attrapez la vue avant que le gestionnaire de fenêtres ne la génère. Certaines mises en page sont très compliquées. Si la mise en page comprend des mises en page imbriquées, layout_weight..etc, la répétition de plusieurs fois par relais prend exactement la taille voulue. La meilleure solution est d'attendre la fin du travail du gestionnaire de fenêtres, puis de faire une capture d'écran. Essayez de mettre getDrawingCache () dans le gestionnaire.

2
Kislingk

Les réponses de @ cV2 et @ nininho fonctionnent toutes les deux pour moi.

L’une des autres raisons pour lesquelles j’ai découvert la difficulté, c’est que la vue que j’avais générée était en train de générer une vue dont la largeur et la hauteur étaient égales à 0 (imaginons qu’il y ait TextView avec un texte de chaîne vide) =). Dans ce cas, getDrawingCache retournera null, alors assurez-vous de vérifier cela. J'espère que cela aide certaines personnes.

1
Bundeeteddee

L'erreur peut être due à votre vue trop grande pour tenir dans le cache de dessin .

J'ai eu l'explication de mon problème "View.getDrawingCache null" de mes journaux:

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

Les documents Android aussi dit : Les appareils Android ne peuvent disposer que de 16 Mo de mémoire disponible pour une seule application. C'est pourquoi vous ne pouvez pas charger de gros bitmap.

1
Yuliia Ashomok

J'essaie de créer le nombre n d'images de manière dynamique en fonction de la vue.

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

Je pense que ce code aidera quelqu'un ..

1
Harish