0

我有一个使用 ViewPager 的应用程序。在 ViewPager 中我不使用 Fragments,只使用膨胀的视图(带有一些内容的 RelativeLayout)。这些视图是预先创建的并保存在一个列表中。我创建了简单的 PagerAdapter 实现,它覆盖了方法 getCount、isViewFromObject、instantiateItem 和 destroyItem。

在 Android 2.x 设备上运行时,一切运行良好,并且方法 instantiateItem 仅对作为屏幕外页面加载的每个页面调用一次。

但是当我在 ICS 上运行时,instantiateItem 方法被循环调用,整个应用程序停止响应。我所能意识到的是,instanceiteItem 方法作为测量的结果被调用。但我不知道为什么在 ICS 上测量会周期性地循环调用,我能做些什么来阻止它。

这是一个代码片段,但我相信它没有什么特别之处:

    mAdapter = new PagerAdapter()
    {
        @Override
        public boolean isViewFromObject(View arg0, Object arg1)
        {
            return arg0 == arg1;
        }

        @Override
        public int getCount()
        {
            return mPages.size();
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position)
        {
            View v = mPages.get(position);
            boolean isChild = false;
            for(int idx = 0; idx < getChildCount(); ++idx)
            {
                if(getChildAt(idx) == v)
                {
                    isChild = true;
                    break;
                }
            }
            if(!isChild)
                addView(v);
            return v;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object item)
        {
            removeView((View)item);
        }

    };
    setAdapter(mAdapter);

此代码位于派生自 ViewPager 的类的初始化方法中。

我真的很感激任何提示,因为这个问题让我发疯,并使我的应用程序无法在 ICS 设备上使用。

4

1 回答 1

1

答案隐藏在应用程序本地化中 - 我覆盖 Application.onConfigurationChange 并设置新的默认区域设置并使用此新区域设置更新配置。

这是强制应用程序区域设置的推荐方法,但在 ICS 上,当切换到横向时,它会导致我的包含 ViewPager 的活动定期重新创建。

如果您遇到这种情况,我建议您重写 Activity.onConfigurationChange 而不是 Application 的方法。出于某种原因,它在 ICS 上运行良好。

于 2012-04-23T13:36:15.837 回答