【问题标题】:Android resource not found exception onPageScrolledAndroid 资源未找到异常 onPageScrolled
【发布时间】:2016-11-16 20:19:33
【问题描述】:

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

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

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

}

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

【问题讨论】:

  • 你打电话给color(0),你的错误表明它对此不满意
  • mOnboardingAdapter.getItem(position + 1) 似乎有 backgroundColor() 返回的属性未初始化
  • 嗨@cricket_007 你能详细说明一下吗,我在问题中添加了更多信息以使其更清楚,我将如何在位置+ 1 处初始化项目?
  • 我只是指出错误的含义...整数为 0,找不到该资源。添加一些 Log 语句进行调试。我不确定你的颜色是否正确stackoverflow.com/questions/5271387/…

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


【解决方案1】:

好的,所以我浏览了文档并发现了我遗漏的重要内容:

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

在 positionOffset 变回零后,应用程序基本上会在第二个屏幕上崩溃。看看它是如何工作的: 在第一个屏幕上, positionOffset 为零,页面的位置也为零,但是 position + 1 不可用,因为 positionOffset 为零。我通过添加以下语句来检查 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);
            }
        }

【讨论】:

    【解决方案2】:

    尝试使用这个

    Color.parseColor(mOnboardingAdapter.getItem(position + 1));
    

    别忘了删除整数转换

    (Integer)
    

    我认为

    mOnboardingAdapter.getItem(position + 1)
    

    为空值(未初始化)

    【讨论】:

    • 嗨,你能告诉我如何初始化这个mOnboardingAdapter.getItem(position + 1)我已经用更多信息更新了这个问题,希望这会有所帮助
    • 好的,你能告诉我为什么你使用 addOnPageChangeListener 而不是 OnPageChangeListener 吗??
    • 我认为它的 getItemPosition(position);不是getItem()
    • getItemPosition() 将返回项目的位置,我需要的是 getItem(position) 以便在该位置返回片段对象。然后可以使用该对象来获取背景颜色。
    • 好的 @NoelOmondi 然后你必须使用实例传递位置,公共静态 OnboardingFragment newInstance(SlideFragmentBuilder builder, int position) {}
    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2011-12-24
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多