1

我试图从Android支持设计库实现BottomSheetBehavior。我初始化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);异步任务的异常,并在onCreate方法中查找视图。另外,如果你正在更新视图,你应该在onPostExecute方法中做。 – AndroidRuntimeException

+0

@AgustinSivoplás,非常感谢。我的事件没有注意到从'doInBackground()'调用方法。 –

回答

5

问题

NPE是因为您在视图之前调用BottomSheetBehavior.setState(...) - bottomSheetFrame被计划了。此时BottomSheetBehavior在视图上有null引用,并且无法将您的状态应用于该视图。

解决方案

我解决了这个问题,通过使用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

伟大的解决方案,你从沮丧的下午救了我:) –

相关问题