首页 > 解决方案 > 在幕后创建片段

问题描述

我的应用程序的一项功能是将图表导出为 PDF 格式。我曾经在图表片段上有一个导出按钮来执行此操作。它非常简单,简称为

chart.draw(canvas)

使用图表视图到 pdf 页面的画布上。

但是由于我添加了其他导出格式,我将导出按钮从这个片段移到了一个更通用的位置。现在我理论上可以只设置图表视图,但是包含图表视图的整个片段具有相当复杂的逻辑来设置图表视图的状态。所以我的想法是用相同的数据创建片段并让它自己设置状态,然后我可以抓住图表视图并绘制到画布上。为此,我尝试了

        val inflater = LayoutInflater.from(MainActivity.instance)
        withContext(uiDispatcher) {
            chartFrag = Archive()
            val v = chartFrag!!.onCreateView(inflater, null, null)
            chartFrag!!.setID(setID, ChartType.TYPE1)
            chartFrag!!.onViewCreated(v!!, null)
        }
        val chart = chartFrag!!.chart

然后使用与以前相同的 PDF 创建代码的图表。我所有的文本都是在 pdf 上创建的,所以 PDF 的创建很好,只是图表视图的创建不起作用。

我最好的猜测是,也许我不能用 null 作为容器调用,或者它不是由于不属于绘制周期的一部分而没有绘制的。

我也试过做

v!!.visibility = View.VISIBLE
v!!.invalidate()

有任何想法吗?我认为如果它快速转换到图表片段只是为了获取视图,那将是一个糟糕的用户体验。

编辑:我已经让它工作了一些,我做了我之前发布的事情,然后抓取视图,将其从父视图中删除并将其添加到当前视图中,然后等待它出现(使用延迟(2000))然后我可以做chart.draw(canvas)。那么除非视图可见,否则没有办法使用 View.Draw(Canvas) 吗?我还能怎么处理这个?

EDIT2:使用上面的编辑,我能够将视图可见性更改为不可见,它仍然被绘制到画布上,但从未出现在屏幕上。所以仍然不是一个很好的解决方案,但它显然和完美的解决方案一样好。我能想到的唯一另一种方法是让分离的 Fragment 处于有效状态,我认为没有任何方法可以这样做。据我了解,拥有可以绘制到画布的有效视图的唯一方法是将其放在布局中,并且每个布局都必须包含在某些东西中。

标签: androidkotlinandroid-fragments

解决方案


您是否尝试过使用 post 来确保在您绘制星星之前加载您的视图?

像这样:

view.post(
     chart.draw(canvas)
)

推荐阅读