7

Mam problemy z implementacją Google Map w Fragment.getMapAsync() w Fragment

To moja część mojej klasie fragment:

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); 

Dostaję błąd w getMapAsync (this). Mówię Typ niekompatybilny.

mówi:

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

znaleziono: void

BTW tutaj jest moja 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> 

Odpowiedz

38

w układzie XML należy zrobić, jak to

<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> 

wewnątrz swojej fragmentu wdrożenia tego

private MapView mapView; 
private GoogleMap googleMap; 

nadpisanie onCreateView Jeśli nie ma onCreateView tak jak poniższy kod

@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); 
} 

przesłonięcie onViewCreated() wewnątrz tego onViewCreated() umieścić ten

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

kiedy już wdrożyć OnMapReadyCallback w swoim fragment umieścić to/kod jak ten

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

nadzieję, że to pomaga.

+0

nie można rozwiązać symbolu "zobacz" – RussVirtuoso

+0

Powinieneś przesłonić onCreateView i nadmuchać swój układ w ten sposób. @Override publicznego Zobacz onCreateView (LayoutInflater inflater, ViewGroup pojemnik, Bundle savedInstanceState) {// napompować układ dla tego fragmentu powrotnej inflater.inflate (R.layout.your_layout, kontener, false); } –

+0

Czy zastąpiłeś metodę onViewCreated w swoim fragmencie? –

0

Twój kod zwraca ten błąd, ponieważ getMapAsync() nic nie zwraca. Jeśli spojrzeć na dokumentacji dla tej funkcji:

public void getMapAsync (OnMapReadyCallback callback)

Ustawia obiekt wywołania zwrotnego, który będzie uruchamiany, gdy instancja GoogleMap jest gotowy do użycia.

Należy pamiętać, że:

Ta metoda musi zostać wywołana z głównego wątku. Połączenie zwrotne zostanie wykonane w głównym wątku w postaci . W przypadku, gdy usługi Google Play nie są zainstalowane na urządzeniu użytkownika, wywołanie zwrotne nie zostanie uruchomione , dopóki użytkownik go nie zainstaluje. W rzadkim przypadku, gdy GoogleMap jest zniszczony natychmiast po utworzeniu, wywołanie zwrotne nie jest wywoływane. Obiekt GoogleMap dostarczany przez wywołanie zwrotne ma wartość inną niż null.

OnMapReadyCallback to interfejs, który wymaga zaimplementowania i przekazania za pośrednictwem tej funkcji. Nic nie jest aktualnie przypisana do zmiennej googleMap należy zamiast ustawić jego wartość w tym bloku kodu, który implements OnMapReadyCallback

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


    } 

Kod ten powinien być w swoim Fragment gdzieś. Ponieważ Twój Fragment już implementuje ten interfejs, przekazujesz go jako this.

+0

Mam już onMapReady na mojej klasie. dzięki za odpowiedź btw, – RussVirtuoso

0

Po kilku przegrzaniem w głowie, dzięki tym poście i https://stackoverflow.com/a/34732804/3925554, chciałbym powiedzieć, że obecnie istnieją dwa sposoby dodawania MapFragment do swojej aplikacji (przepraszam, patrz niżej):

<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"/> 

W ten sposób należy użyć standardowego fragmentu i zaimplementować go w środku. Faktycznie jesteś wstawienie fragmentu do drugiego:

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

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

Innym sposobem byłoby:

<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> 

W tym przypadku można użyć prawdziwego SupportMapFragment i wdrożyć go w ten sposób:

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

    getMapAsync(this); 
} 

Działają bez konieczności dzwonienia pod numer mapView.onCreate(savedInstanceState); i mapView.onResume(); ręcznie wewnątrz onViewCreated(), co i tak nie jest zalecane.

Mam nadzieję, że pomoże!

Updated: Kiedy pisał ten Przetestowałem dwa sposoby, a oni pracowali, przysięgam! Wybrałem drugą opcję, nie wiem dlaczego, ale wczoraj mapView nagle wychodzi puste, nie ma błędów ani wyjątków, przejście do pierwszej opcji go naprawiło. Przeklęte Ci Google! Czemu?!