在SwipeRefreshLayout @ v23.2.0

时间:2016-03-01 02:52:14

标签: android android-support-library

将支持库更新为版本23.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)

似乎是一个支持库的bug,是否有任何人也有这个问题?任何解决方法?

3 个答案:

答案 0 :(得分:1)

检查所有库可能会覆盖某些资源'void android.graphics.drawable.Drawable.setAlpha(int)'。 void setAlpha(null)

答案 1 :(得分:0)

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

public class MySwipeRefreshLayout extends SwipeRefreshLayout {
    // constructor methods here

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

答案 2 :(得分: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 调用reset时,抛出该异常。

更多信息:NullPointerException:SwipeRefreshLayout.setColorViewAlpha