ViewPagerBottomSheet icon indicating copy to clipboard operation
ViewPagerBottomSheet copied to clipboard

NullPointerException

Open ahmed3elshaer opened this issue 7 years ago • 12 comments

i just integrated the library and i got this Error on launching the app

FATAL EXCEPTION: main Process: com.wadeeny.ondemand, PID: 20144 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.view.View.isNestedScrollingEnabled()' on a null object reference at android.support.v4.view.ViewCompat$ViewCompatApi21Impl.isNestedScrollingEnabled(ViewCompat.java:1320) at android.support.v4.view.ViewCompat.isNestedScrollingEnabled(ViewCompat.java:3308) at biz.laenger.android.vpbs.ViewPagerBottomSheetBehavior.findScrollingChild(ViewPagerBottomSheetBehavior.java:609) at biz.laenger.android.vpbs.ViewPagerBottomSheetBehavior.findScrollingChild(ViewPagerBottomSheetBehavior.java:615) at biz.laenger.android.vpbs.ViewPagerBottomSheetBehavior.findScrollingChild(ViewPagerBottomSheetBehavior.java:622) at biz.laenger.android.vpbs.ViewPagerBottomSheetBehavior.onLayoutChild(ViewPagerBottomSheetBehavior.java:252) at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:894) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1171) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635) at android.widget.LinearLayout.onLayout(LinearLayout.java:1544) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635) at android.widget.LinearLayout.onLayout(LinearLayout.java:1544) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323) at android.widget.FrameLayout.onLayout(FrameLayout.java:261) at com.android.internal.policy.DecorView.onLayout(DecorView.java:758) at android.view.View.layout(View.java:19590) at android.view.ViewGroup.layout(ViewGroup.java:6053) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2488) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2204) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1390) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6754) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966) at android.view.Choreographer.doCallbacks(Choreographer.java:778) at android.view.Choreographer.doFrame(Choreographer.java:713) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:172) at android.app.ActivityThread.main(ActivityThread.java:6637) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

ahmed3elshaer avatar Mar 27 '18 22:03 ahmed3elshaer

Wrap your ViewPager with NestedScrollView:

<android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <android.support.v4.view.ViewPager
                android:id="@+id/bottom_sheet_viewpager"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </android.support.v4.widget.NestedScrollView>

hynra avatar Apr 04 '18 10:04 hynra

@hynra this can avoid the exception. but my listview in ViewPagerBottomSheet can't scroll anymore.

gcobc12632 avatar Apr 18 '18 09:04 gcobc12632

Is this reproducible with (corresponding adjustments inside) the example app from this repository?

laenger avatar Apr 18 '18 23:04 laenger

@laenger I'm also getting the same issue. If I use the same layout in the example app it works. However in my app it crashes with this error. If I remove viewpager from my layout the app doesn't crash. However on adding the viewpager it crashes! I'm trying to integrate your library in Open Food Facts android app.

huzaifaiftikhar avatar Jun 02 '18 22:06 huzaifaiftikhar

Looking at this again, it seems that #24 fixed this.

laenger avatar Jun 07 '18 14:06 laenger

I tried this fix already before it was merged. It seems to fix the error since we do a null check however the viewpager doesn't scroll anymore. If I try to scroll down the bottom sheet collapses. Maybe I am doing something wrong. Please help!

huzaifaiftikhar avatar Jun 07 '18 18:06 huzaifaiftikhar

Again, without a minimal reproducible example, it is very difficult to dig deeper into this. It would be great if you could modify the example app such that it runs into the described issue.

laenger avatar Jun 14 '18 08:06 laenger

I was having the same crash and it was because I wasn't adding any fragment to the view pager. Be sure to check that you're adding some fragment to the view pager so it can initiate right

danponce avatar Jun 28 '18 21:06 danponce

I have the same problem and a reprodcution path. You need to use a PagerAdapter instead of a FragmentPagerAdapter to reproduce it.

jobburg avatar Aug 03 '18 07:08 jobburg

I was also having this problem. I solved it by adding android:nestedScrollingEnabled="true" to my ViewPager.

daniellAlgar avatar Sep 18 '18 09:09 daniellAlgar

@daniellAlgar This solution is not correct, because of incorrect work of behavior. I found a better solution for this bug. Try to use ViewPager.post { BottomSheetUtils.setupViewPager(viewPager) }.

Think it would be helpful. But need to understand how to fix it in lib.

beelancrp avatar Oct 02 '18 13:10 beelancrp

For a better understanding, I show you how I use it. ` override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)

    pagerAdapter = StoryBoardStatsFragmentPagerAdapter(activity!!.supportFragmentManager)

    if (storyResponse.likedusers.isNotEmpty()) {
        pagerAdapter.addFragment(StoryDetailsTabFragment.newInstance(
                StoryDetailsTabFragment.TabType.LIKES, storyResponse, this),
                storyResponse.likeCount.toString().plus(" likes"))
    }

    if (storyResponse.viewedusers.isNotEmpty()) {
        pagerAdapter.addFragment(StoryDetailsTabFragment.newInstance(
                StoryDetailsTabFragment.TabType.VIEWS, storyResponse, this),
                storyResponse.viewCount.toString().plus(" views"))
    }

    viewPager.offscreenPageLimit = 1
    viewPager.adapter = pagerAdapter

    tabs.setupWithViewPager(viewPager)
}

override fun onDataLoaded() {
    viewPager.post {
        behavior = ViewPagerBottomSheetBehavior.from(container)

        behavior.isHideable = true
        behavior.setBottomSheetCallback(object : ViewPagerBottomSheetBehavior.BottomSheetCallback() {
            override fun onSlide(bottomSheet: View, slideOffset: Float) {
                val percent = slideOffset * 100
                if (percent <= 45 && wasExpanded)
                    behavior.state = ViewPagerBottomSheetBehavior.STATE_HIDDEN
            }

            override fun onStateChanged(bottomSheet: View, newState: Int) {
                if (newState == BottomSheetBehavior.STATE_EXPANDED)
                    wasExpanded = true

                if (newState == BottomSheetBehavior.STATE_HIDDEN)
                    router.clearStackFragment()
            }
        })

        BottomSheetUtils.setupViewPager(viewPager) {
            router.clearStackFragment()
        }
    }
}`

beelancrp avatar Oct 02 '18 13:10 beelancrp