基本上是标题所说的,
我的应用程序主要由使用FragmentStatePagerAdapter
的ViewPager
组成
当我将一系列SurfaceViews
添加到 FragmentStatePagerAdapter 时,会出现此问题。只是出于测试目的,我没有以任何方式对SurfaceViews进行子类化。当我浏览几页,点击"主页",然后返回活动时,整个设备会冻结一两秒钟,然后渲染任何内容。我可以在从后退堆栈中拉出后恢复所需的时间内多次启动并完成()应用程序。我知道应用程序正在运行,因为在第一次屏幕绘制最终发生时,几个 AsyncTasks 几乎已经完成。我知道这些异步任务不会导致问题,因为我已经删除了它们,但没有效果。
当我更改 SurfaceView 以Views
问题完全消失时。
当我使用实际的 SurfaceViews(对于我的项目来说是不可协商的)时,也会出现此问题。此问题也发生在多个设备上。
在这一点上,我认为错误完全出在 ViewPager 上,但我不知道该怎么办,因为我需要那个界面组件。
任何帮助将不胜感激!
编辑:
为了澄清,SurfaceViews/Views 表示添加到 FragmentStatePagerAdapter 的片段视图。
为未来的谷歌员工找到了解决方案!
这是我是如何做到的:
在我的片段中,我在onCreate()中实例化了mySurfaceView
。然后我在onCreateView()期间将虚拟布局(LinearLayout)附加到实际视图
然后在onResume()中,我用removeAllViews()清除了虚拟布局,然后调用addView(mySurfaceView)
这似乎允许ViewPager快速构建其布局,然后在用户实际需要看到任何东西之前弹出SurfaceView!
我发现的更好的解决方案是
- 覆盖
FragmentPageAdapter
中的getItem()
- 返回
Fragment
时,请使用Handler
创建 2 秒的延迟
现在,每次您的 Fragment 页面适配器尝试返回SurfaceView
它都会等待 2 秒或其他时间。Surface View将在那个时候启动。下面显示
fragmentAdapter extends FragmentPageAdapter
。
@Override
getItem(int position)
。
if (position == 0)
> final Handler handler = new Handler();
> handler.postDelayed(new Runnable() {
> @Override
> public void run() {
> // initiate SurfaceView
> // return fragment after 5s
> }
> }, 5000);