c# - Screenshots of multiple actionbar tabs -


i using xamarin , c# suspect problem equally valid in java environment.

i have actionbar activity hosts 3 tabs each of hosts fragment. uses viewpager allow user swipe between tabs.

the requirement programmatically screenshot each tab , email these attachments.

the problem whilst actionbar/viewpager works optimises tabs - isn't creating fragment's view until next in line shown. so, if you're on tab 0 - first tab - fragment view tab 2 null. can't screenshot.

to overcome have tried set tab/fragment has null view selected. generates view because setting selected not render on screen view not have width or height value again cannot screenshot (this reason defensive check @ start of code taking screenshot).

so, guess question how can force tab rendered on screen correctly filled out , can screenshot?

my main code extracts follows:

    private void emailreport()     {         list <bitmap> bitmaps = new list<bitmap>();         list <string> summaryfiles = new list<string>();          // remember tab we're on         var selectedtab = this.actionbar.selectednavigationindex;          // take screenshots         (int fragmentnumber = 0; fragmentnumber < projectfragmentpageradapter.count; fragmentnumber++)         {              android.support.v4.app.fragment fragment = projectfragmentpageradapter.getitem(fragmentnumber);             if (fragment.view == null)             {                 this.actionbar.gettabat(fragmentnumber).select();                 fragment = projectfragmentpageradapter.getitem(fragmentnumber);             }              bitmaps.add(screenshot(fragment.view));         }          // set active tab         this.actionbar.gettabat(selectedtab).select();          //write screenshots  file          int = 0;         foreach(bitmap bitmap in bitmaps)         {             if (bitmap != null)                 summaryfiles.add(bitmaptofile(bitmap, this.actionbar.gettabat(i).text));             i++;         }          // send file         emailsupport.sendattachments(this, summaryfiles);     }      private bitmap screenshot(view fragmentrootview)     {         if (fragmentrootview == null || fragmentrootview.width == 0 || fragmentrootview.height == 0)             return null;          fragmentrootview.drawingcacheenabled = true;          //create bitmap layout , draw view         bitmap bitmap = bitmap.createbitmap(fragmentrootview.width, fragmentrootview.height,bitmap.config.argb8888);         canvas canvas = new canvas(bitmap);          //get view's background         drawable bgdrawable = fragmentrootview.background;         if (bgdrawable!=null)   // has background drawable, draw on canvas             bgdrawable.draw(canvas);         else                    // not have background drawable, draw white background on canvas             canvas.drawcolor(color.white);          // draw view on canvas         fragmentrootview.draw(canvas);         fragmentrootview.drawingcacheenabled = false;          return bitmap;     } 

any gratefully received.

the solution in end simple. viewpager has setting controlling number of pages (fragments) hold "activated". defaults 1. had 3 tabs meant there 1 tab (fragment) out of reach.

so, whilst setting viewpager following before tabs added:

reportviewpager.offscreenpagelimit = pagecount - 1; 

or in java

reportviewpager.setoffscreenpagelimit(pagecount - 1); 

i hope helps else avoid wasting hours.


Comments

Popular posts from this blog

c++ - OpenMP unpredictable overhead -

ruby on rails - RuntimeError: Circular dependency detected while autoloading constant - ActiveAdmin.register Role -

javascript - Wordpress slider, not displayed 100% width -