Android BottomSheetBehavior setState()NullPointerException

时间:2016-03-14 21:09:58

标签: java android nullpointerexception android-support-library android-design-library

我尝试从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点击或其他动作更改状态。求你帮帮我。

2 个答案:

答案 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线程)中调用与视图相关的任何东西。