我正在开发一个多选测试应用程序,它有一个ViewPager和一个问题(可能包含图像)的片段和每个页面上可能的答案,因为一些带文字的图像可能难以阅读我已经添加了一个“自制”缩放功能,使用javascript,在绘制问题webview后点击按钮(我放弃了缩放,因为它在不同的Android版本之间存在许多不兼容性),它会动态修改css。工作得很好,我在顶部有两个放大镜图标+和 - 并且点击后他们在webview上激活javascript并实现缩放效果,然后缩放因子存储在共享设置中,以便有一个“默认缩放”,它是应用的每页选择。
我的目标是,一旦缩放因子发生变化并移动到下一页,它就会保留并适应缩放因子,但它在第2页上有效,而页面则以默认缩放显示。
我猜这个问题与ViewPager的屏幕外缓存有关(奇怪的是我尝试了三个问题测试,你在第一页改变了缩放,移到了第二个,缩放没有改变,移到第三个并且我想要应用缩放,虽然非常奇怪!)所以我尝试用viewPager.setOffScreenPAgeLimit(0)禁用该缓存,但它不起作用。我已经尝试了接下来的两个代码块(单独),但没有用,所以我被困住了,任何帮助都将不胜感激。
提前致谢!!
PS。最奇怪的是,如果我设置一个断点并调试该行,Javascript被触发但是webview没有更新,我将粘贴下面的行作为参考:
webViewQuestion.loadUrl("javascript:$('img').css('width', '" + newScaleFactor + "%');" +
"newFontSize=1*" + newScaleFactor + "/100;" +
"strNewFontSize=newFontSize.toString()+'em';" +
"$('#content').css('font-size',strNewFontSize);");
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
mViewPager.invalidate();
mSectionsPagerAdapter.notifyDataSetChanged();
}
@Override
public void onPageSelected(int position) {
if(position==1){
mViewPager.invalidate();
mSectionsPagerAdapter.notifyDataSetChanged();
}
}
编辑1:
好的,问题不是我之前说过的第2页,它是跟随我点击缩放按钮的页面,它有意义,因为它是缓存的。
目前我用下一个代码解决了它并且运行得很好,我知道返回POSITION_NONE这是一个非常糟糕的做法,因为它重绘了所有片段,事实上在我的情况下我的观点非常复杂,我注意到延迟ev'ry屏幕正在重绘,但我所做的是设置一个静态变量,指示重绘是否必要(在缩放按钮单击后将其设置为true,并在onPageSelected中将其设置为false,如下所示)。目前正在发挥作用,但无论如何我希望有人能提出更好的解决方案。
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public void onPageSelected(int position) {
if(mustRedraw){
mSectionsPagerAdapter.notifyDataSetChanged();
mViewPager.invalidate();
mustRedraw=false;
}