5

基本上就是标题所说的,

我的应用程序主要由一个ViewPager使用FragmentStatePagerAdapter

SurfaceViews当我向 FragmentStatePagerAdapter添加一系列时会出现问题。仅出于测试目的,我没有以任何方式对 SurfaceViews 进行子类化。当我浏览几页,点击“主页”,然后返回活动时,整个设备会冻结一两秒钟,然后再渲染任何内容。我可以在从后台退出后恢复应用程序的时间内多次启动和完成()应用程序。我知道应用程序正在运行,因为在第一个屏幕绘制最终发生时,几个 AsyncTask 几乎完成了。我知道这些 AsyncTask 不会导致问题,因为我已将它们删除,但没有任何效果。

当我将 SurfaceViews 更改为Views问题完全消失。

当我使用我的实际 SurfaceViews(对于我的项目是不可协商的)时,也会出现这个问题。在多个设备上也会出现此问题。

在这一点上,我认为问题完全出在 ViewPager 上,但我不知道该怎么办,因为我需要那个界面组件。

任何帮助将不胜感激!

编辑:

澄清一下,SurfaceViews/Views 代表被添加到 FragmentStatePagerAdapter 的 Fragment 的 View。

4

2 回答 2

5

为任何未来的谷歌员工找到了解决方案!

下面是我是如何做到的:

在我的片段中,我在 onCreate() 中实例化了 mySurfaceView

然后我在 onCreateView() 期间将虚拟布局(LinearLayout)附加到实际视图

然后在 onResume() 我用 removeAllViews() 清除了虚拟布局,然后调用 addView(mySurfaceView)

这似乎允许 ViewPager 快速构建其布局,然后在用户实际需要查看任何内容之前弹出 SurfaceView!

于 2012-07-06T09:26:33.827 回答
0

我找到的更好的解决方案是

  • 覆盖getItem()_FragmentPageAdapter
  • 返回时使用Fragment创建 2 秒的时间延迟Handler

就是这样,每次您的 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);
于 2017-07-11T15:45:30.130 回答