2013-07-27 8 views
26

Ich habe das Tutorial Navigation Drawer gefolgt und alles funktioniert wie ein Charme mit Ausnahme eines kleinen Panne. Ich werde versuchen, es so weit wie möglich zu erklären, und wenn es immer noch nicht klar ist, werde ich versuchen, ein Video des Problems hochzuladen.Warum stört DrawerLayout beim Öffnen manchmal?

Problem passiert beim Versuch, die Schublade zu öffnen und nur beim Öffnen, und passiert nur manchmal, nicht immer. Das ist, wenn ich anfange, es zu öffnen es stört und friert mit ungefähr 4 Millimetern offen und immer die gleiche Entfernung ein. Es würde sich dann nicht weiter öffnen oder zurück schließen, wenn ich meinen Finger zurückbewege, wenn ich loslasse, schließt es sich.

Bitte beachten Sie:

  • ich es auf mehreren Geräten ausprobiert haben (Nexus 7, Nexus) und virtuelle Geräte als auch, das Problem weiterhin besteht.
  • Issue replicated using the example provided by Google. (Youtube Link)
  • Issue presented with my app. (Youtube Link)
  • ich es geschafft, das Problem einmal repliziert aber nur einmal in Google Mail-App (die meiner Meinung nach die gleiche Implementierung verwendet), aber viel häufiger mit meiner app und der Beispielanwendung.
  • Ich bemerkte, dass der Störschub in der gleichen Entfernung auftritt, in der sich die Schublade öffnet, wenn Sie nur auf den Rand des Bildschirms klicken, da er nach dem ersten Öffnen einfriert und sich nicht verschiebt.

Alle Zeiger würden geschätzt werden.

+1

Können Sie bitte einen Screenshot anhängen? – PravinCG

+0

Tritt es auf, wenn Sie das Menü öffnen, indem Sie vom Rand weg gleiten oder das Symbol drücken (vorausgesetzt, Sie haben diese Funktion implementiert) oder in beiden Fällen? Haben Sie das Logcat für irgendwelche Ausnahmen überprüft? Ich habe noch nie so etwas gesehen und habe rund 10 Geräte getestet. Welche Version der Support-Bibliothek verwenden Sie? ** S. ***: Tritt dieser Effekt auch bei der Beispiel-App auf? (siehe http://developer.android.com/training/implementing-navigation/nav-drawer.html) – Trinimon

+0

@Trinimon passiert nur durch Schieben. Logcat zeigt nichts an. War mit der vorherigen Support-Bibliothek, und hat nur das Update, das in letzter Zeit veröffentlicht wurde und es immer noch passiert (Version 18). Ich habe der ursprünglichen Frage ein Video hinzugefügt, wenn Sie es überprüfen möchten. – LuckyMe

Antwort

23

erforschte ich den Code von DrawerLayout und die nächste Ausgabe gefunden: Wenn wir den Rand des Bildschirms berühren dort klein erscheint (20 * Dichte px) Teil des drawer (es macht Schublade leichter bewegen). Es erscheint nicht sofort, sondern nach einem bestimmten Zeitintervall (160 ms). Es wird von postDelayed realisiert.

Die drawer kann in mehreren Zuständen sein: IDLE, DRAGGING und SETTLING. Wenn es im Zustand DRAGGING war, kann es mit demselben Zeiger und derselben Kante nicht mehr in diesen Zustand zurückkehren (weil eine Bedingung vorliegt: mEdgeDragsInProgress[pointerId] & edge) == edge, die es nicht erlaubt, die Kante zu ziehen, die bereits gezogen wurde).

So in einigen Fällen hat die Schublade in den Zustand DRAGGING bereits verschoben, wenn die verzögerte Runnable ausgeführt wird. Diese verzögerte Aktion öffnet drawer für 20 * Dichte px und ändert den Status drawer. So kann drawer nicht mehr verschoben werden (weil es nicht in den Zustand DRAGGING zurückkehren kann).

Es gibt einen Code zum Abbrechen der verzögerten Aktion (die Schublade öffnet), aber dieser Code in der Methode onInterceptTouchEvent, die nur einmal aufgerufen wird (weil es false zurückgibt). Ich denke, dass dieser Code in der Methode sein sollte.

Leider habe ich keine Möglichkeit gefunden, verzögertes Ereignis abzubrechen (weil es Modifikator private hat und ich es nicht bekommen kann). So nur eine Weise, die ich gefunden: Kopieren Sie den Quellcode von DrawerLayout zu meinem Projekt und diese kleine Änderung vornehmen: Kopieren

case MotionEvent.ACTION_MOVE: { 
      // If we cross the touch slop, don't perform the delayed peek for an edge touch. 
      if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { 
       mLeftCallback.removeCallbacks(); 
       mRightCallback.removeCallbacks(); 
      } 
      break; 
     } 

aus dem Verfahren onInterceptTouchEvent dem Verfahren onTouchEvent.

+0

Große Forschung, Requisiten für die nächste Stufe.Nur ein Follow-up, so die 'DelayedRunnable 'wenn es ausgeführt wird, ändert sich der Zustand auf" SETTLING ", dann auf" DRAGGING "oder nur auf" DRAGGING ", aber dann stört es, weil der Zustand von" DRAGGING "zu" DRAGGING "einmal geändert wurde Ain? – LuckyMe

+1

Wie ich verstehe, Zustand "DRAGGING" - "Schublade" folgt Finger, Zustand "SETTLING" - "Schublade" bewegt sich mit der konstanten Geschwindigkeit, z. wenn wir es in der Mitte freigeben, bewegt es sich weiter, um zu schließen oder zu öffnen). 'DelayedRunnable' ändert den Status in' SETTLING' (da es nur Animation ist, folgt 'Schublade' nicht dem Finger). – esentsov

+3

Eine andere Problemumgehung ist die Verwendung von android: clickable = "true" im Hauptinhalt FrameLayout. http://stackoverflow.com/questions/18044277/android-navigation-drawer-bug-using-the-sample –

1

Es gibt keinen Fehler in der Datei drawerslayout. Fügen Sie der Datei content.xml (setcontentview file) und eine Bildlaufansicht als übergeordnete oder Stammansicht hinzu. Tools: context = ". MainActivity"

+1

Diese Frage hatte bereits eine Antwort, die angenommen wurde - nachdem Sie die anderen Antworten angeschaut haben, sollten Sie wirklich nur eine späte Antwort einreichen, wenn Sie der Meinung sind, dass Ihre Antwort einen großen Mehrwert bietet (zum Beispiel mit den neuesten Dienstprogrammen/Bibliotheken) ist 3 Jahre alt). – ishmaelMakitla

+0

aber ich denke nicht, dass das Problem hier gelöst wurde –

Verwandte Themen