我有一个使用ViewPager的应用程序。在ViewPager内部我不使用Fragments,只使用膨胀的视图(带有一些内容的RelativeLayout)。这些视图是预先创建的并保存在List中。我创建了简单的PagerAdapter实现,它覆盖了方法getCount,isViewFromObject,instantiateItem和destroyItem。
在Android 2.x设备上运行时,它运行正常,并且对于作为屏幕外页面加载的每个页面,只调用一次instantiateItem方法。
但是当我在ICS上运行时,instantiateItem方法在循环中被调用,整个应用程序停止响应。我能够意识到的是,instantiateItem方法是作为测量结果调用的。但我不知道为什么在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设备上使用。
答案 0 :(得分:1)
答案在应用程序本地化中隐藏 - 我重写Application.onConfigurationChange并使用这个新的Locale设置新的默认Locale和更新配置。
这是强制应用程序的Locale的推荐方法,但是在ICS上,它导致我的活动包含ViewPager,当切换到横向时会定期重新创建。
如果您遇到过这种情况,我建议覆盖Activity.onConfigurationChange而不是Application的方法。出于某种原因,它在ICS上运行良好。