Ich verwende eine GoogleMap (v2 api) innerhalb eines Fragments innerhalb eines ViewPagers. Das ursprüngliche Problem, das ich hatte, war, dass der ViewPager alle horizontalen Scroll-Gesten aufzeichnete, so dass die Karte nur gezogen werden konnte, wenn der Benutzer in vertikaler oder diagonaler Richtung startete. Alle horizontalen Ziehen wurde von der ViewPager
erfasst. Ich fand, dass die Lösung darin besteht, eine abgeleitete ViewPager
Klasse zu erstellen und die canScroll
Methode zu überschreiben. Die Ansicht, die gezogen wird, wird an diese Methode übergeben, sodass Sie eine Entscheidung basierend auf dem Typ der Ansicht treffen können.Benutzerdefinierter ViewPager, damit das untergeordnete GoogleMap-Steuerelement horizontal scrollen kann
In meinem Fall ist mein Fragment ein SupportMapFragment
(aus dem com.google.android.gms.maps
Paket), die mir ein GoogleMap-Objekt gibt, mit dem ich interagieren kann. Die tatsächliche Steuerung, die ich in der ViewPager-Methode canScroll
erhalte, ist jedoch vom Typ maps.j.b
. Ich habe das Problem mit dem folgenden Code in meiner benutzerdefinierten ViewPager-Klasse behoben. Ich fühle mich jedoch nicht wohl bei der Suche nach diesem Klassennamen, wenn ich nichts darüber weiß. Was ist maps.j.b? Ist dies zur Laufzeit eine dynamisch erstellte Klasse? Ist es möglich, dass sich der Typ in einem zukünftigen Update des Frameworks ändert? Gibt es nur das View-Objekt, gibt es eine robustere Möglichkeit zu überprüfen, ob der Drag-Vorgang von einem Map-Steuerelement ausgelöst wurde?
@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
if(v.getClass().getName().equals("maps.j.b")) {
return true;
}
return super.canScroll(v, checkV, dx, x, y);
}
Sie haben höchstwahrscheinlich Recht damit, dass es sich um eine ProGuard-Ausgabe handelt, da die Felder der Laufzeitinstanz ebenfalls alle aus einem Zeichen bestehen. Der Typ, den ich zur Laufzeit bekomme, steht mir zur Kompilierzeit nicht zur Verfügung, also weiß ich nicht, ob ich mit instanceof etwas anfangen kann. Und wenn man bedenkt, dass der Typname, den ich heute verwende, von der Version der Bibliothek abhängt, die ich verwende, kann ich mir vorstellen, dass ich dies in einen Komponententest verpacken kann, um nach Änderungen zu suchen. Ich werde das Objekt und seine Klasse zur Laufzeit überprüfen und schauen, ob ich etwas Stabileres finden kann. Wie immer, danke für Ihre Hilfe und Input. – Rich
@Rich: "Der Typ, den ich zur Laufzeit bekomme, steht mir zur Kompilierzeit nicht zur Verfügung" - nein, aber 'instanceof' funktioniert immer noch. Sie müssen nur feststellen, ob es sich um eine 'MapView' oder eine Unterklasse handelt, und 'instanceof' durchläuft die Vererbungskette. – CommonsWare
Gibt es eine Möglichkeit für mich, die Vererbungskette zur Laufzeit zu betrachten (z. B. in dem Fenster "Ausdrücke" in Eclipse)?Außerdem dachte ich an einen noch einfacheren Ansatz, der funktioniert, da meine Karte den gesamten verfügbaren Platz ausfüllt. Da der Adapter, der den ViewPager einspeist, explizit angibt, welches Fragment in welche Position kommt, kann ich auch einfach nach der Position und dem vCheck-Booleschen Wert suchen, was bedeutet, dass ich mich am Blatt der Ansichtshierarchie befinde (keine Kinder mehr zu prüfen). Ich habe gerade diese Methode getestet und es funktioniert so weit. – Rich