多个操作栏选项卡的屏幕截图

时间:2014-12-02 10:22:24

标签: c# android xamarin

我正在使用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;
    }

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

最终的解决方案非常简单。 ViewPager有一个设置控制它将保持“激活”的页面(片段)数量。默认为1.由于我有3个标签,这意味着总有一个标签(片段)无法触及。

因此,在设置ViewPager时,在添加选项卡之前执行以下操作:

reportViewPager.OffscreenPageLimit = pageCount - 1;

或者在Java中

reportViewPager.setOffscreenPageLimit(pageCount - 1);

我希望这可以帮助别人避免浪费时间。