1

Я пытаюсь реализовать BottomSheetBehavior из библиотеки поддержки Android Support. Я инициализировать BottomSheetBehavior так:Android BottomSheetBehavior setState() NullPointerException

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(); 
    } 

Это очень странно, потому что я могу изменить свое состояние с Button щелчком мыши или другого действия. Пожалуйста, помогите мне.

+0

Удалить эту строку Посмотреть bottomSheetFrame = rootView.findViewById (R.id.bottom_sheet); outiside async task, и сделать поиск внутри метода onCreate. Также, если вы обновляете представление, вы должны использовать метод onPostExecute. – AndroidRuntimeException

+0

@ AgustinSivoplás, большое вам спасибо. Я не заметил, что метод вызывается из 'doInBackground()'. –

ответ

5

Проблема

NPE происходит потому, что вы называете BottomSheetBehavior.setState(...) до вашего зрения - bottomSheetFrame был вынут. В данный момент BottomSheetBehavior ссылается на представление и не может применить ваше состояние к нему.

Решение

Я установил это с помощью метода: View.post(Runnable)

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

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

В моей ситуации это помогло остановить NPE-s :)

+0

Эй! Спасибо за ответ. Хорошее решение, но в моем случае мне нужно просто вывести код из 'AsyncTask'. –

+0

Отличное решение, вы спасли меня после обеда разочарования :) –

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