我尝试从Android支持设计库中实施BottomSheetBehavior
。我像这样初始化BottomSheetBehavior
:
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 :(得分:6)
<强>问题强>
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:)
答案 1 :(得分:1)
如果您在Fragment
中使用它,只需确保在onCreateView()
方法中调用它。而且,如果您在Activity
上使用它,请在onCreate()
方法上调用它。
此时,除非已经通过编程方式创建视图,否则必须已经创建了视图。
由于您正在从AsyncTask
调用与UI相关的方法,因此您需要按照https://stackoverflow.com/a/27992603/973919
runOnUiThread
包围它。
基本上,您需要从应用程序的主线程(即UI线程)中调用与视图相关的任何东西。