2016-03-01 2 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) '. Пустота setAlpha (null)

+1

Хороший звонок! Не совсем настоящая проблема, но она отбросила меня в правильном направлении. Я использовал метод утилиты, который устанавливал образы чертежей ImageView и фоновые рисунки в нуль, надеясь освободить память немного быстрее –

0

Я не видел эту проблему, но если это действительно виджет SwipeRefreshLayout, вы можете подклассифицировать ее и обернуть вызов onDetachedFromWindow блоком try/catch.

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 и это Drawable как NULL, и когда SwipeRefreshLayout вызвал для сброса то, что выбрало исключение.

больше по адресу: NullPointerException:SwipeRefreshLayout.setColorViewAlpha

Смежные вопросы