7

Ich habe Probleme mit der Implementierung von Google Map in Fragment.getMapAsync() in Fragment

Das ist mein der Teil meines Fragment Klasse:

public class FragmentStoreFinderMap extends Fragment implements OnMapReadyCallback { 

// Google Map 
private GoogleMap googleMap; 
private int i; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

     googleMap = ((SupportMapFragment)getActivity().getSupportFragmentManager().findFragmentById(
       R.id.map)).getMapAsync(this); 

Ich erhalte einen Fehler in getMapAsync (this). Ich erkläre den inkompatiblen Typ.

heißt es:

erforderlich: com.google.android.gms.map.GoogleMap

gefunden: void

BTW hier ist mein xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 
<fragment class="com.google.android.gms.maps.SupportMapFragment" 
    android:id="@+id/map" 
    android:name="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</LinearLayout> 

Antwort

38

In der XML-Layout sollten Sie tun, wie dies

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<com.google.android.gms.maps.MapView 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</FrameLayout> 

in Ihrem Fragmente diese

private MapView mapView; 
private GoogleMap googleMap; 

Übersteuerung implementieren onCreateView wenn es keine onCreateView genau wie der Code unter

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.your_layout, container, false); 
} 

Override onViewCreated() innerhalb dieser onViewCreated() setzen diese

mapView = (MapView) view.findViewById(R.id.map); 
mapView.onCreate(savedInstanceState); 
mapView.onResume(); 
mapView.getMapAsync(this);//when you already implement OnMapReadyCallback in your fragment 

, wenn Sie bereits implementieren OnMapReadyCallback in Ihrem Fragment dieses/Code wie dieser das

@Override 
public void onMapReady(GoogleMap map) { 
    googleMap = map; 
} 

Hoffnung

stellen Ihnen hilft.

+0

kann nicht lösen Symbol "view" – RussVirtuoso

+0

Sie sollten onCreateView überschreiben und Ihr Layout wie folgt aufblasen. @Override Öffentlichkeit onCreateView (LayoutInflater inflater, Viewgroup Container, Bundle savedInstanceState) {// aufpumpen das Layout für dieses Fragment return inflater.inflate (R.layout.your_layout, Container, false); } –

+0

Haben Sie die onViewCreated in Ihrem Fragment überschrieben? –

0

Ihr Code gibt diesen Fehler zurück, weil getMapAsync() nichts zurückgibt. Wenn Sie in der Dokumentation suchen für diese Funktion:

public void getMapAsync (OnMapReadyCallback Rückruf)

Legt eine Rückruf Objekt, das ausgelöst wird, wenn die GoogleMap Instanz bereit ist, verwendet werden.

beachten:

Dieses Verfahren aus dem Haupt-Thread aufgerufen werden muss. Der Callback wird im Hauptthread ausgeführt. Wenn die Google Play-Dienste nicht auf dem Gerät des Benutzers installiert sind, wird der Rückruf nicht ausgelöst , bis der Benutzer es installiert. In dem seltenen Fall, dass die GoogleMap sofort nach der Erstellung zerstört wird, wird der Rückruf nicht ausgelöst. Das GoogleMap-Objekt, das vom Rückruf bereitgestellt wird, ist nicht null.

OnMapReadyCallback ist eine Schnittstelle, die über diese Funktion implementiert und weitergegeben werden muss. Nichts wird zur Zeit zugewiesen Ihre googleMap Variable sollten Sie stattdessen setzen Sie den Wert in diesem Block von Code, die implements OnMapReadyCallback

@Override 
    public void onMapReady(GoogleMap googleMap) { 
     this.googleMap = googleMap; 


    } 

Dieser Code sollte irgendwo in Ihrem Fragmente sein. Da Ihr Fragment diese Schnittstelle bereits implementiert, übergeben Sie es als this.

+0

Ich habe bereits die onMapReady auf meiner Klasse. Danke für die Antwort BTW, – RussVirtuoso

0

Nach einigen Überhitzungen in meinem Kopf, dank diesem Beitrag und https://stackoverflow.com/a/34732804/3925554, ich würde sagen, dass es derzeit zwei Möglichkeiten, um eine MapFragment, um Ihre Anwendung hinzuzufügen (tut mir leid, siehe unten):

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
class="com.google.android.gms.maps.SupportMapFragment" 
android:id="@+id/map" 
android:name="com.google.android.gms.maps.SupportMapFragment" 
android:layout_width="match_parent" 
android:layout_height="match_parent"/> 

Auf diese Weise müssen Sie ein Standardfragment verwenden und dieses im Inneren implementieren. Eigentlich sind Sie ein Fragment in ein anderes einfügen:

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    SupportMapFragment supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); 
    supportMapFragment.getMapAsync(this); 
} 

Der andere Weg wäre:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".ui.main.MainActivity"> 

<com.google.android.gms.maps.MapView 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

</FrameLayout> 

In diesem Fall können Sie die echte SupportMapFragment verwenden und setzen es auf diese Weise:

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    getMapAsync(this); 
} 

Und sie funktionieren, ohne mapView.onCreate(savedInstanceState); und mapView.onResume(); manuell innerhalb onViewCreated() aufrufen, was sowieso nicht empfohlen wird.

Hoffe es hilft!

Aktualisiert: Als ich das gepostet habe teste ich die zwei Möglichkeiten und sie arbeiteten, ich schwöre es! Ich wählte die zweite Option, ich weiß nicht warum, aber gestern mapView geht plötzlich leer, keine Fehler oder Ausnahmen, Wechsel zur ersten Option hat es behoben. Verflucht du Google! Warum?!