【问题标题】:BottomSheetBehavior Illegal state argument: 5BottomSheetBehavior 非法状态参数:5
【发布时间】:2018-05-31 23:28:58
【问题描述】:

有人能解释一下这个异常是什么时候发生的吗?

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);
                }
            }
        };
    }
}

【问题讨论】:

    标签: android illegalstateexception bottom-sheet


    【解决方案1】:
    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);
        }
      }
    

    您的错误是:Illegal state argument: 5。 5 是 STATE_HIDDEN 的 int 值。因此,虽然您的状态是 STATE_HIDDEN (5),但您的 mHideable 布尔值是错误的。因此,基本建议是设置 mHideable = true;

    没有任何代码,我能告诉你的就这么多了。

    【讨论】:

    • 有道理,我已经添加了我的控制器类。
    • 我认为问题在于 bottomSheetBehavior.setHideable(true); 部分在您的 bind() 方法中的某些条件下没有被调用,因为它也可能由于某种原因没有被调用。尝试使用断点调试您的应用。
    • 测试团队正在运行monkey测试,调试困难。但我相信问题就在这里:public void onStateChanged(@NonNull View bottomSheet, int newState)
    • 我认为接受的答案应该是 @SerjArdovic 的评论 bottomSheetBehavior.setHideable(true); 需要被调用。
    【解决方案2】:

    sheetBehavior.setHideable(true); 解决了我的问题 似乎当setHideable 为false 然后将状态设置为BottomSheetBehavior.STATE_HIDDEN 时会发生异常

    【讨论】:

      【解决方案3】:

      正如@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">
      

      【讨论】:

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