10

Sau khi thực hiện mới Snackbar trong một vài ứng dụng của tôi, tôi nhận được lỗi sau:ArrayIndexOutOfBoundsException khi gạt bỏ Snackbar/ViewDragHelper

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at 
android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(SourceFile:1014) at 
android.support.design.widget.SwipeDismissBehavior.onInterceptTouchEvent(SourceFile:188) at 
android.support.design.widget.Snackbar$Behavior.onInterceptTouchEvent(SourceFile:659) at 
android.support.design.widget.Snackbar$Behavior.onInterceptTouchEvent(SourceFile:641) at 
android.support.design.widget.CoordinatorLayout.performIntercept(SourceFile:343) at 
android.support.design.widget.CoordinatorLayout.onInterceptTouchEvent(SourceFile:376) at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1827) at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241) at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946) at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241) at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946) at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241) at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946) at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241) at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946) at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241) at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946) at 
android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241) at 
android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946) at 
com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1968) at 
com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1420) at 
android.app.Activity.dispatchTouchEvent(Activity.java:2428) at 
android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(SourceFile:59) at 
android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(SourceFile:59) at 
com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1916) at 
android.view.View.dispatchPointerEvent(View.java:7475) at 
android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3744) at 
android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3672) at 
android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4924) at 
android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4884) at 
android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5036) at 
android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) at 
android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) at 
android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171) at 
android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5004) at 
android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5058) at 
android.view.Choreographer$CallbackRecord.run(Choreographer.java:776) at 
android.view.Choreographer.doCallbacks(Choreographer.java:579) at 
android.view.Choreographer.doFrame(Choreographer.java:546) at 
android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762) at 
android.os.Handler.handleCallback(Handler.java:725) at 
android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:153) at 
android.app.ActivityThread.main(ActivityThread.java:5299) at java.lang.reflect.Method.invokeNative(Native 
Method) at java.lang.reflect.Method.invoke(Method.java:511) at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) at dalvik.system.NativeStart.main(Native 
Method) 

Tôi đang sử dụng các thiết lập tương tự ở đây: https://github.com/chrisbanes/cheesesquare/blob/master/app/src/main/java/com/support/android/designlibdemo/MainActivity.java

public class MainActivity extends AppCompatActivity { 

    private Snackbar snackbar;  

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       // if showing already, close 
       if (this.snackbar != null) { 
        this.snackbar.dismiss(); 
       } 

       // make new snackbar 
       this.snackbar = Snackbar.make(view, "Here's a Snackbar", Snackbar.LENGTH_LONG).show(); 


       // chris banes example 
       // Snackbar.make(view, "Here's a Snackbar", Snackbar.LENGTH_LONG).setAction("Action", null).show(); 

      } 
     }); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     // dismiss when user clicks "home" 
     if (this.snackbar != null) { 
      this.snackbar.dismiss(); 
     } 
    } 
} 

Tóm tắt:

    .210
  • Tôi đang sử dụng Snackbar
  • Tôi đang sử dụng CoodinartorLayout
  • Tôi không sử dụng các vấn đề với Google DrawerLayout

:

Dựa trên dòng android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(SourceFile:1014) at trong Ngoại lệ, tôi đoán nó có liên quan đến việc "loại bỏ" số Snackbar?

Có lẽ tôi không nên dismiss số Snackbar trong ? Tôi đã từng làm điều này với Toast s.

+0

"Tôi nhận được lỗi sau" - làm bạn có nghĩa là bạn đã không sao chép này trong phòng thí nghiệm, nhưng bạn đang nhận được nó thông qua báo cáo tai nạn trong sản xuất ứng dụng? "Có lẽ tôi không nên bỏ qua Snackbar trong onPause?" - tốt, không giống như 'Toast', AFAIK là một' Snackbar' là một phần trong hệ thống phân cấp của hoạt động, vì vậy nó không nên can thiệp vào các hoạt động khác tiếp quản nền trước, nếu đó là lý do bạn loại bỏ nó. – CommonsWare

+0

Vâng, chính xác. Tôi không thể tái tạo điều này trên bất kỳ thiết bị nào của tôi hoặc bất kỳ thử nghiệm nào. –

+0

Tại sao điều này lại bị bỏ phiếu? –

Trả lời

1

Một giải pháp mà tôi tìm thấy là đảm bảo rằng giải pháp không phải là "có thể vuốt" bằng cách sử dụng findViewById(android.R.id.content). Giải pháp này về cơ bản "tránh" và ngăn chặn các lỗi xảy ra.

Snackbar.make(findViewById(android.R.id.content), "Hello!", Snackbar.LENGTH_LONG); 

nên được cố định trong 23.2.1: https://stackoverflow.com/a/36004008/950427

+0

Việc cập nhật lên 23.2.1 có khắc phục vấn đề này cho bạn không @JaredBurrows? – ernestkamara

+0

Tôi không chắc chắn. '24.0.0' đã hết. Đảm bảo sử dụng mới nhất. –

+0

Có, tôi cũng đã kiểm tra Thư viện hỗ trợ Android của mình và đó là 23.2.1 và không có bản cập nhật nào cho tôi – DomeWTF

Các vấn đề liên quan