我正在使用Xamarin和C#,但我怀疑这个问题在Java环境中同样有效。
我有一个ActionBar Activity,它包含三个标签,每个标签都有一个片段。它使用ViewPager允许用户在标签之间滑动。
要求是以编程方式截取每个标签,然后将这些标签作为附件发送。
问题在于,虽然ActionBar / ViewPager运行良好,但它也可以优化选项卡 - 实际上它不会创建片段的视图,直到它显示在下一行。因此,如果您在选项卡0(第一个选项卡)上,则选项卡2的片段视图为空。所以它不能截图。
为了解决这个问题,我尝试设置任何具有空视图的选项卡/片段。这会生成视图但是因为设置它而不是实际在屏幕上呈现它,视图没有宽度或高度值所以再次它不能截图(这是在代码开始时进行防御性检查的原因截图)。
所以,我想我的问题是如何强制在屏幕上呈现标签,以便正确填写并可以截图?
我的主要代码摘录如下:
private void EmailReport()
{
List <Bitmap> bitmaps = new List<Bitmap>();
List <string> summaryFiles = new List<string>();
// remember the tab we're on
var selectedTab = this.ActionBar.SelectedNavigationIndex;
// take the screenshots
for (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 the active tab back
this.ActionBar.GetTabAt(selectedTab).Select();
//write the screenshots into file
int i = 0;
foreach(Bitmap bitmap in bitmaps)
{
if (bitmap != null)
summaryFiles.Add(BitmapToFile(bitmap, this.ActionBar.GetTabAt(i).Text));
i++;
}
// now send the 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 a bitmap for the layout and then draw the view into it
Bitmap bitmap = Bitmap.CreateBitmap(fragmentRootView.Width, fragmentRootView.Height,Bitmap.Config.Argb8888);
Canvas canvas = new Canvas(bitmap);
//Get the view's background
Drawable bgDrawable = fragmentRootView.Background;
if (bgDrawable!=null) // has background drawable, then draw it on the canvas
bgDrawable.Draw(canvas);
else // does not have background drawable, then draw white background on the canvas
canvas.DrawColor(Color.White);
// draw the view on the canvas
fragmentRootView.Draw(canvas);
fragmentRootView.DrawingCacheEnabled = false;
return bitmap;
}
感谢任何帮助。
答案 0 :(得分:0)
最终的解决方案非常简单。 ViewPager有一个设置控制它将保持“激活”的页面(片段)数量。默认为1.由于我有3个标签,这意味着总有一个标签(片段)无法触及。
因此,在设置ViewPager时,在添加选项卡之前执行以下操作:
reportViewPager.OffscreenPageLimit = pageCount - 1;
或者在Java中
reportViewPager.setOffscreenPageLimit(pageCount - 1);
我希望这可以帮助别人避免浪费时间。