10

po wdrożeniu nowego Snackbar w kilku moich zastosowań, ja otrzymuję następujący błąd:ArrayIndexOutOfBoundsException podczas odwoływania 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) 

Używam tej samej konfiguracji tutaj: 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(); 
     } 
    } 
} 

Podsumowanie:

  • Używam Snackbar
  • Używam CoodinartorLayout
  • Nie używam tych DrawerLayout

Problemy Google:

Na podstawie linii android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(SourceFile:1014) at w Wyjątku, przypuszczam, że ma to związek z "zwolnieniem" z Snackbar?

Może nie powinienem dismiss the Snackbar w ? Zrobiłem to z Toast s.

+0

„Otrzymuję następujący błąd” - czy to znaczy, że nie powielać tego w laboratorium, ale są coraz to przez zgłaszania awarii w produkcji aplikacje? "Może nie powinienem odrzucić Snackbaru w ciągu dnia?" - Cóż, w przeciwieństwie do 'Toast', AFAIK a' Snackbar' jest częścią hierarchii widoków twojej aktywności, więc nie powinno to ingerować w inne działania, które przejmą pierwszy plan, jeśli dlatego go odrzucałeś. – CommonsWare

+0

Tak, dokładnie. Nie mogę tego odtworzyć na żadnym z moich urządzeń ani żadnych testów. –

+0

Dlaczego to jest głosowanie? –

Odpowiedz

1

Jednym z rozwiązań, które znalazłem, było upewnienie się, że nie można go "przesunąć", używając findViewById(android.R.id.content). To rozwiązanie w zasadzie "unika" i zapobiega wystąpieniu błędu.

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

powinna być ustalona w 23.2.1: https://stackoverflow.com/a/36004008/950427

+0

Czy aktualizacja do 23.2.1 rozwiązała ten problem dla Ciebie @JaredBurrows? – ernestkamara

+0

Nie jestem pewien. '24.0.0' jest już wyłączony. Upewnij się, że używasz najnowszego. –

+0

Tak, również sprawdziłem moją bibliotekę pomocy Androida i jest to 23,2.1 i nie ma dla mnie żadnej aktualizacji – DomeWTF

Powiązane problemy