2017-12-18 24 views
2

이 예외가 발생할 때 누군가 설명 할 수 있습니까?BottomSheetBehavior 잘못된 상태 인수 : 5

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) 

방법은 불법 또는 부적절한 인수가 전달되었음을 나타냅니다 자바 클래스

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
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 부울은 거짓입니다. 그래서, 기본 제안은 으로 설정됩니다 mHidable = true;

코드를 입력하지 않아도 내가 말할 수있는만큼.

+0

제 컨트롤러 클래스를 추가했습니다. –

+0

나는 'bottomSheetBehavior.setHideable (true);'부분이 어떤 이유로 든 당신의'bind()'메쏘드 안에서 호출되지 않는다는 것이 문제라고 생각한다. 브레이크 포인트로 앱을 디버깅 해보세요. –

+0

테스트 팀은 원숭이 테스트를 실행 중이므로 디버깅하기가 어렵습니다. 하지만 문제는 여기에 있다고 생각합니다 : 'public void onStateChanged (@NonNull view bottomSheet, int newState)' –