未找到Android资源异常onPageScrolled

时间:2016-11-16 20:19:34

标签: android android-fragments android-viewpager android-adapter

尝试在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上的SlideFragmentBuilderFragment 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);

}

基本上,当用户滑动到另一个页面时,我只需要将一个页面的背景淡入。

2 个答案:

答案 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>]

是空值(未初始化)