Android资源未找到异常onPageScrolled

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

尝试在 onPageScrolled 方法中更改 ViewPager 内的页面背景时出现以下异常。我已经编辑了问题以使其更清楚。

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)

首先我创建 slider 对象,这包括设置背景颜色:

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

这是 SlideFragmentBuilder 的链接在 github 上和 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);

}

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

最佳答案

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

int: Position index of the first page currently being displayed. Page position+1 will be visible if positionOffset is nonzero.

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

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

关于Android资源未找到异常onPageScrolled,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40641557/

相关文章:

android - 用于流数据的最佳蓝牙模式是什么?

java - 使用 Android 共享 Intent 在 Facebook 中共享文本

android - 如何以编程方式获取 android.R.id.content 的资源 Id?

android - Android Studio 中的 ViewPager 预览布局

java - ViewPager 中的奇怪行为(bug?)

android - 移动后端启动器连续查询永不返回

android - 获取 GPS 固定卫星的数量?

android - 如何在新进程中打开 Android Fragment?

java - 将数据从 fragment 传递到自定义适配器(与 ListView 一起使用)

android - Viewpager 滑动不适用于回收站 View