底部菜单行为非法状态参数:5

25

能有人解释一下这个异常是在什么情况下发生的吗?

12-18 11:20:07.225 15944-15944/com.test.dev.debug E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.dev.debug, PID: 15944
java.lang.IllegalArgumentException: Illegal state argument: 5
    at android.support.design.widget.BottomSheetBehavior.startSettlingAnimation(BottomSheetBehavior.java:631)
    at android.support.design.widget.BottomSheetBehavior$1.run(BottomSheetBehavior.java:550)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6123)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

Java类

public class BottomSheetController {

    private BottomSheetBehavior<View> bottomSheetBehavior;
    private WeakReference<FrameLayout> bottomSheetContainer;
    private Slide slide;

    public interface Slide {
        void onSlide(@NonNull View bottomSheet, float slideOffset);
    }

    public void bind(FrameLayout bottomSheetContainer) {
        this.bottomSheetContainer = new WeakReference<>(bottomSheetContainer);
        bottomSheetBehavior = BottomSheetBehavior.from(this.bottomSheetContainer.get());
        bottomSheetBehavior.setHideable(true);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
        bottomSheetBehavior.setBottomSheetCallback(sheetCallback());
    }

    public void unbind() {
        this.bottomSheetContainer.clear();
    }

    public void setSlide(Slide slide) {
        this.slide = slide;
    }

    public void collapse() {
        bottomSheetBehavior.setHideable(true);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
    }

    public void expand() {
        bottomSheetBehavior.setHideable(false);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

    public void hide() {
        bottomSheetBehavior.setHideable(true);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    }

    public int getState() {
        return bottomSheetBehavior.getState();
    }

    private BottomSheetBehavior.BottomSheetCallback sheetCallback() {
        return new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {

                if (newState != BottomSheetBehavior.STATE_HIDDEN) {
                    bottomSheetBehavior.setHideable(false);
                } else {
                    bottomSheetBehavior.setHideable(true);
                }
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {

                if (slide != null) {
                    slide.onSlide(bottomSheet, slideOffset);
                }
            }
        };
    }
}
3个回答

28
public class IllegalArgumentException extends RuntimeException

抛出异常用于表示某个方法已经收到了非法或不合适的参数。

在代码的某个地方,您正在向方法startSettlingAnimation()BottomSheetBehavior类)传递非法参数。该方法会抛出此异常:

void startSettlingAnimation(View child, int state) {
    int top;
    if (state == STATE_COLLAPSED) {
      top = mCollapsedOffset;
    } else if (state == STATE_HALF_EXPANDED) {
      top = mHalfExpandedOffset;
    } else if (state == STATE_EXPANDED) {
      top = getExpandedOffset();
    } else if (mHideable && state == STATE_HIDDEN) {
      top = mParentHeight;
    } else {
      throw new IllegalArgumentException("Illegal state argument: " + state);
    }
    if (mViewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) {
      setStateInternal(STATE_SETTLING);
      ViewCompat.postOnAnimation(child, new SettleRunnable(child, state));
    } else {
      setStateInternal(state);
    }
  }

您的错误是:非法状态参数:5。 5是STATE_HIDDEN的整数值。 因此,当您的状态为STATE_HIDDEN(5)时,您的mHideable布尔值为False。因此,基本建议是将mHideable设置为true ;

没有任何代码,这就是我能告诉您的全部。


有道理,我已经添加了我的控制器类。 - Anderson K
5
我认为问题在于您的bind()方法内部某些条件下没有调用bottomSheetBehavior.setHideable(true);部分,因为由于某种原因它也可能不会被调用。尝试使用断点调试您的应用程序。 - Sergey Emeliyanov
测试团队正在运行猴子测试,这使得调试变得困难。但我相信问题出在这里:public void onStateChanged(@NonNull View bottomSheet, int newState) - Anderson K
我认为被接受的答案应该是@SerjArdovic的评论,需要调用bottomSheetBehavior.setHideable(true); - Michael Osofsky

11

对我而言,问题是通过 sheetBehavior.setHideable(true); 解决的。 似乎当 setHideable 为 false,并将状态设置为 BottomSheetBehavior.STATE_HIDDEN 时,将会发生异常。


2
作为@Serj Ardovic解释的那样,它是可隐藏的。
我想补充一点,你也可以将其放在xml中:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:behavior_hideable="true"   <- this here
app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接