当尝试在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);

}


基本上,我只需要在用户滑动到另一页时淡入一页的背景即可。

最佳答案

好的,所以我浏览了文档,发现我错过了一件重要的事情:


  int:当前显示的第一页的位置索引。如果positionOffset不为零,则页面position + 1将可见。


基本上,在positionOffset返回零之后,应用程序在第二个屏幕上崩溃。看看这是如何工作的:
在第一个屏幕上,positionOffset为零,页面的位置也为零,但是由于positionOffset为零,所以position + 1不可用。我通过添加以下语句来检查偏移量是否为零来解决此问题:

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);
            }
        }

10-06 03:40