【问题标题】:Android BottomSheetBehavior setState() NullPointerExceptionAndroid BottomSheetBehavior setState() NullPointerException
【发布时间】:2016-03-14 21:09:57
【问题描述】:

我正在尝试从 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 click 或其他一些动作来改变状态。请帮帮我。

【问题讨论】:

  • 去掉这一行 View bottomSheetFrame = rootView.findViewById(R.id.bottom_sheet);在异步任务之外,并在 onCreate 方法中找到视图。此外,如果您要更新视图,您应该在 onPostExecute 方法中执行。
  • @AgustinSivoplás,非常感谢。我没有注意到方法是从doInBackground() 调用的。

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


【解决方案1】:

问题

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 :)

【讨论】:

  • 嘿!谢谢你的回复。不错的解决方案,但在我的情况下,我只需要将代码从 AsyncTask 中取出。
  • 很好的解决方案,你把我从沮丧的下午中解救了出来 :)
【解决方案2】:

如果您在 Fragment 中使用它,请务必在 onCreateView() 方法中调用它。如果您在 Activity 上使用它,则在 onCreate() 方法中调用它。

此时,您的视图必须已经创建,除非您以编程方式创建它们。

由于您正在从 AsyncTask 调用与 UI 相关的方法,因此您需要用 runOnUiThread 将其包围,如此处所述 https://stackoverflow.com/a/27992603/973919

基本上,您需要从应用程序的主线程(即 UI 线程)调用与视图相关的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多