Android Navigation Schublade geht nicht aufTouchEvent zu Aktivität

Ich habe eine Activity die den Android NavigationDrawer . Bei der Verwendung von nur fragment s (wie üblich) funktioniert alles perfekt. Aber jetzt möchte ich diese drawer auf anderen Aktivitäten meiner App verwenden, und für einige von ihnen möchte ich nicht, dass die Hauptansicht ein fragment .

Frage
Das Problem ist, das onTouchEvent() der activity selbst (und das onItemClickedListener() eines Kindes ListView für diese Angelegenheit) wird nicht aufgerufen, weil die drawer verbraucht. Natürlich möchte ich, dass es angerufen wird 🙂
Unnötig zu sagen, ich würde hoffen, dass die Antwort einfach sein wird (auch ein XML-Eins), und hoffentlich nicht durch die Erweiterung der Drawer (es sei denn, das ist, was es natürlich braucht).

Mehr Info
Das ListView der DrawerLayout ist sehr einfach, im Grunde ein ListView und das DrawerLayout oben (unten in XML).
Die Drawer hat ein fragment wie es ist childView (für Fragment Navigation) und natürlich die ListView für die Drawer Items.

Ich habe viele Fragen zu (nicht genau) ähnlichen Problemen gesehen, und die häufige Antwort war, onInterceptTouch() , requestDisallowInterceptTouchEvent() auf der DrawerLayout und auf der DrawerLayout Ansicht (Hauptinhalt der Activity ) und sogar onTouchEvent() ( Mit False zurückgegeben) auf dem ListView der Schublade.
Nichts scheint den Trick zu tun.

Ich lese diesen Link
Und es scheint, wie mit Intercept Methoden irgendwo könnte die Antwort sein. Aber wie?

Bitte lassen Sie mich wissen, wenn Sie einen Code benötigen. Aber es ist ein sehr einfacher Code / Layout für diese Angelegenheit.
Vielen Dank!

  • Navigation Schubladen-Symbol auf der rechten Seite zeigt Zurück Pfeil-Symbol insted von Hamburger-Symbol
  • Zeigen Sie das Overlay nicht mit der Android Navigationsschublade an
  • Wie deaktiviere man nur die richtige Navigationsschublade?
  • Android, Slidingpanelayout vs navigationDrawer
  • Hinzufügen eines großen Bildes zu einer Navigation Schublade (SlidingMenu libs) - Wie?
  • Berühren Sie irgendwo, um das Menü für die Navigationsschublade zu öffnen
  • Wie erstelle ich Mini-Schublade-Menü in Android?
  • Android: Java: Die Deprecation von SlidingDrawer
  • One Solution collect form web for “Android Navigation Schublade geht nicht aufTouchEvent zu Aktivität”

    Anscheinend ist die Antwort etwas einfach, obwohl es macht Sie verlängern die DrawerLayout und einige denken, und vielleicht wird in einigen seltsamen Ergebnissen führen (mit dem LETZTEN Beispiel, ich habe noch keine gesehen).

    Wie auch immer, verwandte Fragen, die rückwärts schauen, können helfen, das Problem zu verstehen (wird das erste später erklären):
    1. DrawerLayout verhindert den Aufruf von MainActivity.onTouchEvent ()
    2. Wie kann ichDisallowTouchEvents auf Android DrawerLayout anfordern?
    3. Legen Sie den Randrand für Android Navigationsschublade an

    Antworten
    Zuerst bitte, dass ich hier viele Beispiele stelle. Wenn du nur das Beste wünschst (für mich), springe zum letzten.
    Zweitens, wenn jemand genug Reputation hat, bitte kommentieren Sie die Frage des ersten Links und legen Sie einen Link zu dieser Antwort (es kann dem Kerl helfen).

    Beispiel 1
    Nun, im Grunde nur verlängern Android DrawerLayout und ersetzen onTouchEvent () zu diesem:

     @Override public boolean onTouchEvent(MotionEvent arg0) { super.onTouchEvent(arg0); return false; } 

    Diese Lösung wird alles tun, außer dass es nicht die Schublade auf Dias, nur Menü-Klicks und dergleichen öffnen wird. Außerdem klickt es vorwärts, so dass, wenn die Schublade zum Beispiel offen ist, das Berühren außerhalb von ihm wird es nicht schließen, aber klicken Sie auf was auch immer hinter (zB ein ListView). Le'ts versuchen härter …

    Beispiel 2
    Nun, lasst uns die offenen ODER sichtbaren Fälle fangen, um wahr zu kommen (und die Aktion an der Schublade zu konsumieren).

     @Override public boolean onTouchEvent(MotionEvent arg0) { super.onTouchEvent(arg0); if(isDrawerOpen(findViewById(R.id.list_slidermenu)) || isDrawerVisible(findViewById(R.id.list_slidermenu))){ return true; } return false; } 

    Diese Lösung ist besser, da es verhindert, dass hinter der Schublade einklappt, wenn die Schublade offen ist oder sogar sichtbar ist (Rutschen …). Aber Touch-Sliding geht es immer noch nicht.

    Beispiel 3
    Ok, also lass uns einfach nur Fälle aufteilen. Berührungen (MotionEvent.ACTION_DOWN) innerhalb des Schubladenrandes (Bereich, den Google bei der Berührung mit der Schublade verschoben hat) führt dazu, dass True zurückkehrt, um die Aktion zu verbrauchen, und andere werden das Ereignis weiterleiten (Rückkehr False).

     @Override public boolean onTouchEvent(MotionEvent arg0) { super.onTouchEvent(arg0); float edge = 30;//that's for a left drawer obviously. Use <parentWidth - 30> for the right one. View mDrawerListView = findViewById(R.id.drawer_listview); if(isDrawerOpen(mDrawerListView) || isDrawerVisible(mDrawerListView)){ return true; } else if(arg0.getAction() == MotionEvent.ACTION_DOWN && arg0.getX() > edge){ return false; } return true; } 

    Beachten Sie, dass ich 30dp verwendet habe. Das ist, was ich fand, um die Marge (obwohl in einer der Links ist es gesagt, dass 20 ….).

    Nun, das nächste Beispiel würde natürlich entscheiden, was genau ist, dass Rand (siehe in Code oben) Wert ist, laut Android. Wir wollen nicht eine Nummer verwenden, die sich ändern könnte oder was auch immer.

    Neue Frage
    Also jetzt, dass der erste Link sollte praktisch sein. Es "hackt" die Schubladen-Code, um diese Schubladen-Rand / Megin-Nummer zu bekommen. ABER, es hat nicht für mich gearbeitet, da diese genauen Feldnamen nicht gefunden werden konnten.
    Ich laufe mDrawerLayout.getClass (). GetField (), die alle Felder zurückgibt, aber ohne Glück, was wir wollen. Jemand?

    Letztes Beispiel – Vollständiger Code
    Ok, wenn ich auf die Nummer 3 nach dem Verständnis schaue, was genau ich getan habe, können wir es schneller machen, indem wir die onFinishInflate () – Methode erweitern und als globale Variable für diese CustomDrawerLayout für spätere Verwendung speichern. Wir können auch das erste "if" in das zweite setzen, um noch mehr Arbeit zu sparen. OK hier geht:

     View mDrawerListView; ... @Override protected void onFinishInflate() { super.onFinishInflate(); mDrawerListView = findViewById(R.id.drawer_listview); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); if(event.getX() > 30 && event.getAction() == MotionEvent.ACTION_DOWN){ if(isDrawerOpen(mDrawerListView) || isDrawerVisible(mDrawerListView)){ return true; } else{ return false; } } return true; } 

    Das war es fürs Erste! Hoffe, es wird jemandem in der Zukunft neben mir helfen, hehe ….

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.