2016-03-01 55 views
1

切换标签时更新支持的lib到版本后23.2.0NPE上SwipeRefreshLayout @ v23.2.0

compile 'com.android.support:design:23.2.0' 

我开始选项卡之间切换时,这个错误(Android版本5.0.2):

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.drawable.Drawable.setAlpha(int)' on a null object reference 
    at android.support.v4.widget.SwipeRefreshLayout.setColorViewAlpha(SwipeRefreshLayout.java:217) 
    at android.support.v4.widget.SwipeRefreshLayout.reset(SwipeRefreshLayout.java:199) 
    at android.support.v4.widget.SwipeRefreshLayout.onDetachedFromWindow(SwipeRefreshLayout.java:213) 
    at android.view.View.dispatchDetachedFromWindow(View.java:14579) 
    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3138) 
    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3135) 
    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3135) 
    at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4502) 
    at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4475) 
    at android.view.ViewGroup.removeView(ViewGroup.java:4407) 
    at android.support.v4.view.ViewPager.removeView(ViewPager.java:1430) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1165) 
    at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1349) 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:708) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:164) 
    at android.support.v4.view.ViewPager.populate(ViewPager.java:1177) 
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:608) 
    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:570) 
    at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:551) 
    at android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:1991) 
    at android.support.design.widget.TabLayout.selectTab(TabLayout.java:1024) 
    at android.support.design.widget.TabLayout.selectTab(TabLayout.java:994) 
    at android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1262) 
    at android.support.design.widget.TabLayout$TabView.performClick(TabLayout.java:1360) 
    at android.view.View$PerformClick.run(View.java:20978) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:145) 
    at android.app.ActivityThread.main(ActivityThread.java:6134) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

看起来像一个支持库错误,是否有任何人也有这个问题?任何解决方法?

+0

我也面临同样的问题。你有没有找到解决办法?提前致谢。 – user465125

+1

在我的情况setBackgroundDrawable(null);导致问题 –

+0

签出:[更多详情](https://stackoverflow.com/questions/35713793/npe-when-switching-tabs-on-swiperefreshlayout-v23-2-0/44678694#44678694) –

回答

1

检查所有库的可能重写一些资源'void android.graphics.drawable.Drawable.setAlpha(int)'。 void setAlpha(null)

+1

良好的通话!不是真正的问题,但它把我推向了正确的方向。我使用的是一种实用方法,它将ImageView可绘制和背景可绘制设置为null,希望能够更快地释放内存 –

0

我还没有看到这个问题,但是如果它确实在SwipeRefreshLayout小部件中,您可以对它进行子类化并用try/catch块包装onDetachedFromWindow调用。

public class MySwipeRefreshLayout extends SwipeRefreshLayout { 
    // constructor methods here 

    @Override 
    public void onDetachedFromWindow() { 
     try { 
      super.onDetachedFromWindow(); 
     catch (Exception ignore) { 
     } 
    } 
} 
0

异常扔进的代码以下部分:

private void setColorViewAlpha(int targetAlpha) { 
    mCircleView.getBackground().setAlpha(targetAlpha); 
    mProgress.setAlpha(targetAlpha); 
} 

这里mCircleView (CircleImageView)是ImageView的的一个实例。

public void unbindDrawables(View view) { 
    try { 
     if (view != null) { 

      if (view.getBackground() != null) { 
       view.getBackground().setCallback(null); 
      } 
      if (view instanceof ImageView) { 
       ImageView imageView = (ImageView) view; 
       if (imageView != null) { 
        Drawable drawable = ((ImageView) view).getDrawable(); 
        if (drawable != null && drawable instanceof BitmapDrawable) { 
         drawable.setCallback(null); 
        } 
        imageView.setBackgroundResource(0); 
        imageView.setImageDrawable(null); 
        imageView.setBackgroundDrawable(null); 
        imageView.setImageBitmap(null); 
       } 
      } else if (view instanceof ViewGroup) { 
       for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
        unbindDrawables(((ViewGroup) view).getChildAt(i)); 
       } 

       if ((view != null) && !(view instanceof AdapterView)) { 
        ((ViewGroup) view).removeAllViews(); 
       } 
      } 

      view = null; 
     } 
    } catch (Exception e) { 
     //TODO:: handle Exception 
    } 
} 

在上面的代码

if (view instanceof ImageView) { 
         ImageView imageView = (ImageView) view; 
         if (imageView != null) { 
          Drawable drawable = ((ImageView) view).getDrawable(); 
          if (drawable != null && drawable instanceof BitmapDrawable) { 
           drawable.setCallback(null); 
          } 
          imageView.setBackgroundResource(0); 
          imageView.setImageDrawable(null); 
          imageView.setBackgroundDrawable(null); 
          imageView.setImageBitmap(null); 
         } 
        } 

这些部分对mCircleView,它的绘制对象既NULL和:如果您在任何时候在你的应用程序类似的东西进行释放内存的任何行动当SwipeRefreshLayout调用重置然后抛出的异常。

更多于:NullPointerException:SwipeRefreshLayout.setColorViewAlpha