it-swarm.com.de

Google Maps Android API v2 - Interaktives InfoWindow (wie in den ursprünglichen Android-Google-Maps)

Ich versuche ein benutzerdefiniertes InfoWindow nach einem Klick auf eine Markierung mit dem neuen Google Maps API v2 zu erstellen. Ich möchte, dass es wie in der ursprünglichen Kartenanwendung von Google aussieht. So was:

Example Image

Wenn ich ImageButton drin habe, funktioniert es nicht - das gesamte InfoWindow ist geschliffen und nicht nur das ImageButton. Ich habe gelesen, dass es kein View ist, sondern ein Snapshot, sodass einzelne Elemente nicht voneinander unterschieden werden können. 

EDIT: In der Dokumentation (Dank an Disco S2 ):

Wie im vorherigen Abschnitt über Infofenster erwähnt, wird ein Infofenster .__ angezeigt. ist keine Live-Ansicht, sondern die Ansicht wird als Bild auf die .__ gerendert. Karte. Daher werden alle Listener, die Sie für die Ansicht festgelegt haben, nicht berücksichtigt und Sie können nicht zwischen Klickereignissen in verschiedenen Bereichen von .__ unterscheiden. die Aussicht. Es wird empfohlen, keine interaktiven Komponenten zu platzieren, z. B. als Schaltflächen, Kontrollkästchen oder Texteingaben - in Ihrer benutzerdefinierten Info Fenster.

Aber wenn Google es verwendet, muss es einen Weg geben, um es zu schaffen. Hat jemand eine Idee?

181
user1943012

Ich habe selbst ohne Erfolg nach einer Lösung für dieses Problem gesucht, also musste ich meine eigene rollen, die ich hier mit Ihnen teilen möchte. (Bitte entschuldigen Sie mein schlechtes Englisch) (Es ist ein bisschen verrückt, einen anderen Tschechen auf Englisch zu beantworten :-))

Das erste, was ich ausprobiert habe, war, ein gutes altes PopupWindow zu verwenden. Es ist ziemlich einfach - man muss nur OnMarkerClickListener hören und dann eine benutzerdefinierte PopupWindow über der Markierung anzeigen. Einige andere Leute hier bei StackOverflow haben diese Lösung vorgeschlagen, und auf den ersten Blick sieht sie wirklich gut aus. Das Problem mit dieser Lösung wird jedoch angezeigt, wenn Sie die Karte verschieben. Sie müssen PopupWindow irgendwie selbst verschieben, was möglich ist (durch das Anhören einiger onTouch-Ereignisse), aber IMHO kann es nicht gut genug aussehen, besonders auf langsamen Geräten. Wenn Sie es auf die einfache Art und Weise tun, springt es von einer Stelle zur anderen. Sie können auch einige Animationen verwenden, um diese Sprünge zu polieren. Auf diese Weise ist PopupWindow immer "einen Schritt hinter", wo es auf der Karte sein sollte, was mir einfach nicht gefällt. 

An diesem Punkt dachte ich über eine andere Lösung nach. Mir wurde klar, dass ich eigentlich nicht wirklich viel Freiheit brauche - meine benutzerdefinierten Ansichten mit all den damit verbundenen Möglichkeiten (wie animierte Fortschrittsbalken usw.) zu zeigen. Ich denke, es gibt einen guten Grund, weshalb selbst Google-Ingenieure dies in der Google Maps-App nicht so tun. Alles, was ich brauche, ist ein oder zwei Schaltflächen im InfoWindow, die einen gedrückten Status anzeigen und beim Klicken einige Aktionen auslösen. Also habe ich eine andere Lösung gefunden, die sich in zwei Teile aufteilt: 

Erster Teil:
Der erste Teil besteht darin, die Klicks auf den Schaltflächen erfassen zu können, um eine Aktion auszulösen. Meine Idee ist wie folgt:

  1. Behalten Sie einen Verweis auf das im InfoWindowAdapter erstellte benutzerdefinierte InfoWindow bei.
  2. Wickeln Sie MapFragment (oder MapView) in eine benutzerdefinierte ViewGroup (meine heißt MapWrapperLayout)
  3. Überschreiben Sie das dispatchTouchEvent von MapWrapperLayout und leiten Sie (falls das InfoWindow aktuell angezeigt wird) die MotionEvents zuerst an das zuvor erstellte InfoWindow. Wenn die MotionEvents nicht verbraucht werden (z. B. weil Sie in InfoWindow keinen klickbaren Bereich angeklickt haben usw.), lassen Sie die Ereignisse (und nur dann) in die Superklasse MapWrapperLayout übergehen, sodass sie schließlich an die Karte gesendet werden.

Hier ist der Quellcode von MapWrapperLayout:

package com.circlegate.tt.cg.an.lib.map;

import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.model.Marker;

import Android.content.Context;
import Android.graphics.Point;
import Android.util.AttributeSet;
import Android.view.MotionEvent;
import Android.view.View;
import Android.widget.RelativeLayout;

public class MapWrapperLayout extends RelativeLayout {
    /**
     * Reference to a GoogleMap object 
     */
    private GoogleMap map;

    /**
     * Vertical offset in pixels between the bottom Edge of our InfoWindow 
     * and the marker position (by default it's bottom Edge too).
     * It's a good idea to use custom markers and also the InfoWindow frame, 
     * because we probably can't rely on the sizes of the default marker and frame. 
     */
    private int bottomOffsetPixels;

    /**
     * A currently selected marker 
     */
    private Marker marker;

    /**
     * Our custom view which is returned from either the InfoWindowAdapter.getInfoContents 
     * or InfoWindowAdapter.getInfoWindow
     */
    private View infoWindow;    

    public MapWrapperLayout(Context context) {
        super(context);
    }

    public MapWrapperLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MapWrapperLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * Must be called before we can route the touch events
     */
    public void init(GoogleMap map, int bottomOffsetPixels) {
        this.map = map;
        this.bottomOffsetPixels = bottomOffsetPixels;
    }

    /**
     * Best to be called from either the InfoWindowAdapter.getInfoContents 
     * or InfoWindowAdapter.getInfoWindow. 
     */
    public void setMarkerWithInfoWindow(Marker marker, View infoWindow) {
        this.marker = marker;
        this.infoWindow = infoWindow;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean ret = false;
        // Make sure that the infoWindow is shown and we have all the needed references
        if (marker != null && marker.isInfoWindowShown() && map != null && infoWindow != null) {
            // Get a marker position on the screen
            Point point = map.getProjection().toScreenLocation(marker.getPosition());

            // Make a copy of the MotionEvent and adjust it's location
            // so it is relative to the infoWindow left top corner
            MotionEvent copyEv = MotionEvent.obtain(ev);
            copyEv.offsetLocation(
                -point.x + (infoWindow.getWidth() / 2), 
                -point.y + infoWindow.getHeight() + bottomOffsetPixels);

            // Dispatch the adjusted MotionEvent to the infoWindow
            ret = infoWindow.dispatchTouchEvent(copyEv);
        }
        // If the infoWindow consumed the touch event, then just return true.
        // Otherwise pass this event to the super class and return it's result
        return ret || super.dispatchTouchEvent(ev);
    }
}

Dadurch werden die Ansichten im InfoView wieder "live" - ​​die OnClickListener werden ausgelöst usw.

Zweiter Teil: Das verbleibende Problem ist, dass Sie offensichtlich keine Änderungen an der Benutzeroberfläche Ihres InfoWindow auf dem Bildschirm sehen. Dazu müssen Sie Marker.showInfoWindow manuell aufrufen. Wenn Sie jetzt in Ihrem InfoWindow eine permanente Änderung vornehmen (beispielsweise die Beschriftung Ihrer Schaltfläche in etwas anderes ändern), ist dies gut genug. 

Es ist jedoch komplizierter, einen Zustand eines Knopfes oder etwas Ähnliches anzuzeigen. Das erste Problem ist, dass ich (zumindest) nicht in der Lage war, den gedrückten Status der InfoWindow-Taste anzuzeigen. Selbst wenn ich die Taste längere Zeit gedrückt habe, bleibt sie auf dem Bildschirm einfach nicht gedrückt. Ich glaube, dass dies vom Map-Framework selbst gehandhabt wird, was sicherstellt, dass in den Infofenstern kein Übergangszustand angezeigt wird. Aber ich könnte mich irren, ich habe nicht versucht, das herauszufinden.

Was ich getan habe, ist ein weiterer böser Hack - ich habe ein OnTouchListener an die Schaltfläche angehängt und den Hintergrund manuell geändert, wenn die Taste gedrückt oder losgelassen wurde, und zwar zu zwei benutzerdefinierten Zeichenelementen - einer mit einem Button im normalen Zustand und der andere in einem gedrückten Zustand. Das ist nicht sehr schön, aber es funktioniert :). Jetzt konnte ich die Taste auf dem Bildschirm zwischen normalen und gedrückten Zuständen wechseln. 

Es gibt noch eine letzte Störung - wenn Sie zu schnell auf die Schaltfläche klicken, wird der gedrückte Status nicht angezeigt - der normale Zustand bleibt jedoch erhalten (obwohl der Klick selbst ausgelöst wird, "funktioniert" die Schaltfläche). So sieht es zumindest auf meinem Galaxy Nexus aus. Das letzte, was ich getan habe, ist, dass ich den Knopf in seinem gedrückten Zustand etwas verzögert habe. Das ist auch ziemlich hässlich und ich bin mir nicht sicher, wie es auf älteren, langsamen Geräten funktionieren würde, aber ich vermute, dass sogar das Karten-Framework selbst so etwas tut. Du kannst es selbst ausprobieren - wenn du das ganze InfoWindow anklickst, bleibt es etwas länger in gedrückter Form, als es normale Tasten tun (wieder - zumindest auf meinem Handy). Und so funktioniert es auch in der ursprünglichen Google Maps-App.Wie auch immer, ich habe mir selbst eine benutzerdefinierte Klasse geschrieben, die die Statusänderungen der Knöpfe und all die anderen Dinge behandelt, die ich erwähnt habe, also hier der Code:.

package com.circlegate.tt.cg.an.lib.map; import Android.graphics.drawable.Drawable; import Android.os.Handler; import Android.view.MotionEvent; import Android.view.View; import Android.view.View.OnTouchListener; import com.google.Android.gms.maps.model.Marker; public abstract class OnInfoWindowElemTouchListener implements OnTouchListener { private final View view; private final Drawable bgDrawableNormal; private final Drawable bgDrawablePressed; private final Handler handler = new Handler(); private Marker marker; private boolean pressed = false; public OnInfoWindowElemTouchListener(View view, Drawable bgDrawableNormal, Drawable bgDrawablePressed) { this.view = view; this.bgDrawableNormal = bgDrawableNormal; this.bgDrawablePressed = bgDrawablePressed; } public void setMarker(Marker marker) { this.marker = marker; } @Override public boolean onTouch(View vv, MotionEvent event) { if (0 <= event.getX() && event.getX() <= view.getWidth() && 0 <= event.getY() && event.getY() <= view.getHeight()) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: startPress(); break; // We need to delay releasing of the view a little so it shows the pressed state on the screen case MotionEvent.ACTION_UP: handler.postDelayed(confirmClickRunnable, 150); break; case MotionEvent.ACTION_CANCEL: endPress(); break; default: break; } } else { // If the touch goes outside of the view's area // (like when moving finger out of the pressed button) // just release the press endPress(); } return false; } private void startPress() { if (!pressed) { pressed = true; handler.removeCallbacks(confirmClickRunnable); view.setBackground(bgDrawablePressed); if (marker != null) marker.showInfoWindow(); } } private boolean endPress() { if (pressed) { this.pressed = false; handler.removeCallbacks(confirmClickRunnable); view.setBackground(bgDrawableNormal); if (marker != null) marker.showInfoWindow(); return true; } else return false; } private final Runnable confirmClickRunnable = new Runnable() { public void run() { if (endPress()) { onClickConfirmed(view, marker); } } }; /** * This is called after a successful click */ protected abstract void onClickConfirmed(View v, Marker marker); }

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:gravity="center_vertical" >

    <LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:orientation="vertical"
        Android:layout_marginRight="10dp" >

        <TextView
            Android:id="@+id/title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textSize="18sp"
            Android:text="Title" />

        <TextView
            Android:id="@+id/snippet"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="snippet" />

    </LinearLayout>

    <Button
        Android:id="@+id/button" 
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Button" />

</LinearLayout>

<com.circlegate.tt.cg.an.lib.map.MapWrapperLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:tools="http://schemas.Android.com/tools" Android:id="@+id/map_relative_layout" Android:layout_width="match_parent" Android:layout_height="match_parent" tools:context=".MainActivity" > <fragment Android:id="@+id/map" Android:layout_width="match_parent" Android:layout_height="match_parent" class="com.google.Android.gms.maps.MapFragment" /> </com.circlegate.tt.cg.an.lib.map.MapWrapperLayout>

package com.circlegate.testapp;

import com.circlegate.tt.cg.an.lib.map.MapWrapperLayout;
import com.circlegate.tt.cg.an.lib.map.OnInfoWindowElemTouchListener;
import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.GoogleMap.InfoWindowAdapter;
import com.google.Android.gms.maps.MapFragment;
import com.google.Android.gms.maps.model.LatLng;
import com.google.Android.gms.maps.model.Marker;
import com.google.Android.gms.maps.model.MarkerOptions;

import Android.os.Bundle;
import Android.app.Activity;
import Android.content.Context;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.Button;
import Android.widget.TextView;
import Android.widget.Toast;

public class MainActivity extends Activity {    
    private ViewGroup infoWindow;
    private TextView infoTitle;
    private TextView infoSnippet;
    private Button infoButton;
    private OnInfoWindowElemTouchListener infoButtonListener;

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

        final MapFragment mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.map);
        final MapWrapperLayout mapWrapperLayout = (MapWrapperLayout)findViewById(R.id.map_relative_layout);
        final GoogleMap map = mapFragment.getMap();

        // MapWrapperLayout initialization
        // 39 - default marker height
        // 20 - offset between the default InfoWindow bottom Edge and it's content bottom Edge 
        mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20)); 

        // We want to reuse the info window for all the markers, 
        // so let's create only one class member instance
        this.infoWindow = (ViewGroup)getLayoutInflater().inflate(R.layout.info_window, null);
        this.infoTitle = (TextView)infoWindow.findViewById(R.id.title);
        this.infoSnippet = (TextView)infoWindow.findViewById(R.id.snippet);
        this.infoButton = (Button)infoWindow.findViewById(R.id.button);

        // Setting custom OnTouchListener which deals with the pressed state
        // so it shows up 
        this.infoButtonListener = new OnInfoWindowElemTouchListener(infoButton,
                getResources().getDrawable(R.drawable.btn_default_normal_holo_light),
                getResources().getDrawable(R.drawable.btn_default_pressed_holo_light)) 
        {
            @Override
            protected void onClickConfirmed(View v, Marker marker) {
                // Here we can perform some action triggered after clicking the button
                Toast.makeText(MainActivity.this, marker.getTitle() + "'s button clicked!", Toast.LENGTH_SHORT).show();
            }
        }; 
        this.infoButton.setOnTouchListener(infoButtonListener);


        map.setInfoWindowAdapter(new InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                // Setting up the infoWindow with current's marker info
                infoTitle.setText(marker.getTitle());
                infoSnippet.setText(marker.getSnippet());
                infoButtonListener.setMarker(marker);

                // We must call this to set the current marker and infoWindow references
                // to the MapWrapperLayout
                mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
                return infoWindow;
            }
        });

        // Let's add a couple of markers
        map.addMarker(new MarkerOptions()
            .title("Prague")
            .snippet("Czech Republic")
            .position(new LatLng(50.08, 14.43)));

        map.addMarker(new MarkerOptions()
            .title("Paris")
            .snippet("France")
            .position(new LatLng(48.86,2.33)));

        map.addMarker(new MarkerOptions()
            .title("London")
            .snippet("United Kingdom")
            .position(new LatLng(51.51,-0.1)));
    }

    public static int getPixelsFromDp(Context context, float dp) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int)(dp * scale + 0.5f);
    }
}

Ich weiß, dass dies ein hässlicher Hack ist, aber ich habe einfach nichts Besseres gefunden und ich brauche dieses Designmuster so sehr, dass dies wirklich ein Grund wäre, zurück zum Map-v1-Framework zu gehen (was ich übrigens wirklich gerne meide.) für eine neue App mit Fragmenten usw.). Ich verstehe einfach nicht, warum Google Entwicklern keine offizielle Möglichkeit bietet, einen Button in InfoWindows zu haben. Es ist ein so gewöhnliches Designmuster, außerdem wird dieses Muster sogar in der offiziellen Google Maps-App verwendet :). Ich verstehe die Gründe, warum sie Ihre Ansichten nicht einfach in den InfoWindows "live" machen können - dies würde wahrscheinlich die Leistung beeinträchtigen, wenn Sie die Karte verschieben und scrollen. Es sollte jedoch eine Möglichkeit geben, wie dieser Effekt ohne Ansichten erreicht werden kann.

I know this is an ugly hack but I just didn't find anything better and I need this design pattern so badly that this would really be a reason to go back to the map v1 framework (which btw. I would really really like to avoid for a new app with fragments etc.). I just don't understand why Google doesn't offer developers some official way to have a button on InfoWindows. It's such a common design pattern, moreover this pattern is used even in the official Google Maps app :). I understand the reasons why they can't just make your views "live" in the InfoWindows - this would probably kill performance when moving and scrolling map around. But there should be some way how to achieve this effect without using views.

320
chose007

Ich sehe, dass diese Frage schon alt ist, aber immer noch ...

Wir haben eine sipmle-Bibliothek in unserem Unternehmen erstellt, um das Erreichte zu erreichen - ein interaktives Infofenster mit Ansichten und allem. Sie können auf github überprüfen.

Ich hoffe, es hilft :)

11
definera

Hier ist meine Meinung zum Problem. Ich erstelle ein AbsoluteLayout-Overlay, das ein Infofenster enthält (eine reguläre Ansicht mit allen Interaktions- und Zeichenfunktionen). Dann starte ich Handler, wodurch alle 16 ms die Position des Infofensters mit der Position des Punkts auf der Karte synchronisiert wird. Klingt verrückt, funktioniert aber tatsächlich.

Demo-Video: https://www.youtube.com/watch?v=bT9RpH4p9mU (Berücksichtigen Sie, dass die Leistung aufgrund der gleichzeitigen Ausführung von Emulator und Videoaufnahme abnimmt).

Code der Demo: https://github.com/deville/info-window-demo

Ein Artikel mit Details (auf Russisch): http://habrahabr.ru/post/213415/

8

Für diejenigen, die keine choose007's-Antwort erhalten konnten

Wenn clickListener in chose007's-Lösung nicht immer ordnungsgemäß funktioniert, versuchen Sie, View.onTouchListener anstelle von clickListener zu implementieren. Berühren Sie das Berührungsereignis mit einer der Aktionen ACTION_UP oder ACTION_DOWN. Aus irgendeinem Grund verursacht Maps infoWindow ein seltsames Verhalten, wenn an clickListeners gesendet wird. 

infoWindow.findViewById(R.id.my_view).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
          int action = MotionEventCompat.getActionMasked(event);
          switch (action){
                case MotionEvent.ACTION_UP:
                    Log.d(TAG,"a view in info window clicked" );
                    break;
                }
                return true;
          }

Edit: So habe ich es Schritt für Schritt gemacht

Blase zuerst dein eigenes Infofenster (globale Variable) irgendwo in deiner Aktivität/deinem Fragment auf. Meiner ist in Fragment. Stellen Sie außerdem sicher, dass die Root-Ansicht in Ihrem Infowindow-Layout linear ist (aus irgendeinem Grund hat relativelayout die gesamte Bildschirmbreite in Infowindow übernommen).

infoWindow = (ViewGroup) getActivity().getLayoutInflater().inflate(R.layout.info_window, null);
/* Other global variables used in below code*/
private HashMap<Marker,YourData> mMarkerYourDataHashMap = new HashMap<>();
private GoogleMap mMap;
private MapWrapperLayout mapWrapperLayout;

Dann in onMapReady Rückruf von Google Maps Android api (wenn Sie nicht wissen, was onMapReady ist Maps> Dokumentation - Erste Schritte )

   @Override
    public void onMapReady(GoogleMap googleMap) {
       /*mMap is global GoogleMap variable in activity/fragment*/
        mMap = googleMap;
       /*Some function to set map UI settings*/ 
        setYourMapSettings();

MapWrapperLayout Initialisierung http://stackoverflow.com/questions/14123243/google-maps-Android-api-v2- interaktiv-infowindow-like-in-original-Android-go/15040761 # 15040761 39 - Standardmarkerhöhe 20 - Versatz zwischen dem standardmäßigen unteren InfoWindow-Rand und dem unteren Rand des Inhalts * /

        mapWrapperLayout.init(mMap, Utils.getPixelsFromDp(mContext, 39 + 20));

        /*handle marker clicks separately - not necessary*/
       mMap.setOnMarkerClickListener(this);

       mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
                @Override
                public View getInfoWindow(Marker marker) {
                    return null;
                }

            @Override
            public View getInfoContents(Marker marker) {
                YourData data = mMarkerYourDataHashMap.get(marker);
                setInfoWindow(marker,data);
                mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
                return infoWindow;
            }
        });
    }

SetInfoWindow-Methode

private void setInfoWindow (final Marker marker, YourData data)
            throws NullPointerException{
        if (data.getVehicleNumber()!=null) {
            ((TextView) infoWindow.findViewById(R.id.VehicelNo))
                    .setText(data.getDeviceId().toString());
        }
        if (data.getSpeed()!=null) {
            ((TextView) infoWindow.findViewById(R.id.txtSpeed))
                    .setText(data.getSpeed());
        }

        //handle dispatched touch event for view click
        infoWindow.findViewById(R.id.any_view).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = MotionEventCompat.getActionMasked(event);
                switch (action) {
                    case MotionEvent.ACTION_UP:
                        Log.d(TAG,"any_view clicked" );
                        break;
                }
                return true;
            }
        });

Griffmarker separat klicken

    @Override
    public boolean onMarkerClick(Marker marker) {
        Log.d(TAG,"on Marker Click called");
        marker.showInfoWindow();
        CameraPosition cameraPosition = new CameraPosition.Builder()
                .target(marker.getPosition())      // Sets the center of the map to Mountain View
                .zoom(10)
                .build();
        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition),1000,null);
        return true;
    }
2
Manish Jangid

Nur eine Spekulation, ich habe nicht genug Erfahrung, um es auszuprobieren ...) -:

Da es sich bei GoogleMap um ein Fragment handelt, sollte es möglich sein, das Marker-Ereignis onClick abzufangen und die benutzerdefinierte fragment view anzuzeigen. Ein Kartenfragment ist im Hintergrund noch sichtbar. Hat es jemand versucht? Irgendein Grund, warum es nicht funktionieren konnte?

Der Nachteil ist, dass das Kartenfragment auf dem Hintergrundbild eingefroren wird, bis ein benutzerdefiniertes Informationsfragment die Steuerung an dieses zurückgibt.

0
Wooff