Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android BottomSheetBehavior setState() NullPointerException

I'm trying to implement BottomSheetBehavior from Android Support Design Library. I initialize BottomSheetBehavior like this:

private void initBottomSheet() {
        new AsyncTask<Void, Void, Void>() {

            View bottomSheetFrame = rootView.findViewById(R.id.bottom_sheet);

            }

            @Override
            protected Void doInBackground(Void... params) {
                bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetFrame);

                bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                    private boolean isOnTop = false;

                    @Override
                    public void onStateChanged(@NonNull View bottomSheet, int newState) {
                        switch (newState) {

                            case BottomSheetBehavior.STATE_DRAGGING: {
                                ...
                            }

                            case BottomSheetBehavior.STATE_SETTLING: {
                                ...
                            }

                            case BottomSheetBehavior.STATE_EXPANDED: {
                               ...
                            }

                            case BottomSheetBehavior.STATE_COLLAPSED: {
                                ...
                            }

                            case BottomSheetBehavior.STATE_HIDDEN: {
                                ...
                            }

                            default: {
                                break;
                            }
                        }
                    }

                    @Override
                    public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                        ...
                });

                bottomSheetBehavior.setPeekHeight((int) Utils.convertDpToPixel(100f, activityContext));
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); // NPE here

                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
            }
        }.execute();
    }

It's very strange, because I can change state with Button click or some other action. Please, help me.

like image 561
Roman Svyatnenko Avatar asked Jan 06 '23 11:01

Roman Svyatnenko


1 Answers

Problem

NPE happens because you call BottomSheetBehavior.setState(...) before your view — bottomSheetFrame was laid out. At this moment BottomSheetBehavior have null reference on the view and can't apply your state to it.

Solution

I fixed this by using View.post(Runnable) method:

View sheetView = ... ;    
BottomSheetBehavior behavior = BottomSheetBehavior.from(sheetView);
int initState = BottomSheetBehavior.STATE_EXPANDED;

sheetView.post(new Runnable() {
    @Override
    public void run() {
        behavior.setState(initState);
    }
});

In my situation this helped to stop NPE-s :)

like image 119
Alexey Terekhov Avatar answered Jan 31 '23 19:01

Alexey Terekhov