1

當嘗試更改onPageScrolled方法中的ViewPager中的頁面的背景時,我收到以下異常。我編輯了這個問題,以便更清楚地說明問題。Android資源未找到異常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); 

} 

基本上,我只需要一個頁面的背景淡入用戶滑動到另一個頁面。

+0

你叫'色(0)',和 –

+0

'mOnboardingAdapter.getItem(position + 1)'似乎有'backgroundColor()'返回的屬性沒有初始化 –

+0

您好@ cricket_007您能否詳細解釋一下我,爲這個問題添加了一些更多的信息,使其更加清晰,我將如何初始化位置+1的項目? –

回答

1

Ok,s o我瀏覽了文檔,發現我錯過了一件重要的事情:

int:當前顯示的第一頁的位置索引。如果positionOffset不爲零,頁面位置+1將可見。

基本上,應用程序在positionOffset回到零後的第二個屏幕上粉碎。看看它是如何工作的: 在第一個屏幕上,positionOffset爲零,頁面的位置也爲零,但由於positionOffset爲零,所以位置+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); 
      } 
     } 
0

嘗試使用此

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

不要忘了刪除整數投

(Integer) 

,我認爲

mOnboardingAdapter.getItem(position + 1) 

是空值(未初始化)

+0

嗨,你能告訴我如何初始化這個'mOnboardingAdapter。getItem(position + 1)'我用更多的信息更新了這個問題,希望這有助於 –

+0

好的,你能告訴我爲什麼你使用addOnPageChangeListener而不是OnPageChangeListener? –

+0

而我認爲它的getItemPosition(position); not getItem() –