尝试在ViewPager
方法中更改onPageScrolled
内的网页背景时出现以下异常。我已经编辑了这个问题,以便更清楚。
android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:1245)
at android.content.res.Resources.getColor(Resources.java:899)
at android.support.v4.content.ContextCompat.getColor(ContextCompat.java:413)
at com.noel.material_onboarding.OnboardingActivity.color(OnboardingActivity.java:113)
at com.noel.material_onboarding.OnboardingActivity.access$200(OnboardingActivity.java:29)
at com.noel.material_onboarding.OnboardingActivity$1.onPageScrolled(OnboardingActivity.java:86)
首先我创建滑块对象,包括设置背景颜色:
addSlide(new SlideFragmentBuilder()
.description("This is a test")
.backgroundColor(R.color.colorPrimary)
.build());
addSlide(new SlideFragmentBuilder()
.description("This is a test 2")
.backgroundColor(R.color.green)
.build());
addSlide(new SlideFragmentBuilder()
.description("This is a test 3")
.backgroundColor(R.color.orange)
.build());
addSlide(new SlideFragmentBuilder()
.description("This is a test 4")
.backgroundColor(R.color.orange)
.build());
以下是github上的SlideFragmentBuilder和Fragment class itself
的链接这是我的onPageScrolled方法:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
int colorUpdate = (Integer) evaluator.evaluate(positionOffset, color(mOnboardingAdapter.getItem(position).backgroundColor()), color(mOnboardingAdapter.getItem(position + 1).backgroundColor()));
mViewPager.setBackgroundColor(colorUpdate);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(colorUpdate);
}
}
@Override
public void onPageSelected(int position) {
btnFinish.setVisibility(position == mOnboardingAdapter.getLastItemPosition() ? View.VISIBLE : View.GONE);
btnNext.setVisibility(position == mOnboardingAdapter.getLastItemPosition() ? View.GONE : View.VISIBLE);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
使用的color()方法
private int color(@ColorRes int color){
return ContextCompat.getColor(this, color);
}
基本上,当用户滑动到另一个页面时,我只需要将一个页面的背景淡入。
答案 0 :(得分:1)
好的,所以我浏览了文档,发现了一个我错过的重要事项:
int:当前显示的第一页的位置索引。如果positionOffset非零,则页面位置+ 1将可见。
基本上,当positionOffset回到零后,应用程序在第二个屏幕上崩溃。看看它是如何工作的: 在第一个屏幕上,positionOffset为零,页面的位置也为零,但由于positionOffset为零,因此位置+ 1不可用。我通过添加以下语句来解决这个问题,以检查Offset是否为零:
positionOffset != 0.0 ? position + 1 : position
这就是onPageScrolled方法的样子:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
int colorUpdate = (Integer) evaluator.evaluate(positionOffset, color(mOnboardingAdapter.getItem(position).backgroundColor()), color(mOnboardingAdapter.getItem(positionOffset != 0.0 ? position + 1 : position).backgroundColor()));
mViewPager.setBackgroundColor(colorUpdate);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(colorUpdate);
}
}
答案 1 :(得分:0)
尝试使用此
(Integer)
并且不要忘记删除整数转换
mOnboardingAdapter.getItem(position + 1)
我认为
[<expression> for <var> in <iterable>]
是空值(未初始化)