7

ile İlgili Ayrıntılar GetMapAsync() Fragmandaki Google Haritasını uygulama konusunda sorun yaşıyorum.Fragman

Bu benim parçası sınıfının benim parçasıdır:

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

Ben getMapAsync (bu) bir hata alıyorum. Uyumsuz türünü anlatıyorum.

diyor:

gerekli: Bulunan com.google.android.gms.map.GoogleMap

:

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

cevap

38

bu

private MapView mapView; 
private GoogleMap googleMap; 

geçersiz kılma uygulamak için parçanın içinde bu

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

gibi yap onCreateView gerektiği

@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); 
} 
aşağıda kodu gibi hiçbir onCreateView varsa

, onViewCreated() öğesindeki onViewCreated() öğesini geçersiz kılar()senin fragmanı bu size yardımcı olur bu

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

umut gibi bu/kod koymak için zaten OnMapReadyCallback uyguladıklarındabu

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

koydu. Kafamda birkaç hararet sonra

+0

sembolü "görünümü" çözemezsiniz – RussVirtuoso

+0

OnCreateView'i geçersiz kılmalı ve düzeninizi bu şekilde şişirmelisiniz. @Override kamu Görünüm onCreateView (LayoutInflater inflater, ViewGroup konteyner, Paketi savedInstanceState) { // Bu fragman dönüş inflater.inflate düzenini şişirin (R.layout.your_layout, konteyner, false); } –

+0

Parçanızdaki onViewCreated'i geçersiz kıldınız mı? –

0

Kodunuz: void BTW burada

benim xml edilir getMapAsync() hiçbir şey döndürmediğinden bu hatayı döndürüyor. Eğer bu işlev için belgelerine bakarsak:

public void getMapAsync (OnMapReadyCallback geri arama)

GoogleMap örneği kullanıma hazır olduğunda tetiklenecek bir geri arama nesnesi ayarlar.

Bu yöntem, ana iplik çağrılabilir gerekir: bu

not edin. Geri arama, ana iş parçacığında yürütülen olacaktır. Google Play hizmetlerinin kullanıcının cihazında yüklü olmayan olduğu durumlarda, kullanıcı yüklemeden önce geri arama 'u tetiklemeyecektir. GoogleMap'in oluşturulduktan hemen sonra imha edildiği nadir durumlarda geri arama tetiklenmez. Geri arama tarafından sağlanan GoogleMap nesnesi boş değil.

OnMapReadyCallback, bu işlevin uygulanması ve geçirilmesi gereken bir arabirimdir. Hiçbir şey şu anda googleMap değişkene atanır yerine bu kod bir yere senin Fragment olmalıdır implements OnMapReadyCallback

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


    } 

bu kod bloğunda değerini ayarlamanız gerekir. Parçanız zaten bu arabirimi uyguladığı için this olarak iletin.XML düzende

+0

Sınıfımda onMapReady zaten var. btw cevabınız için teşekkürler, – RussVirtuoso

0

, bu yazı ve https://stackoverflow.com/a/34732804/3925554 sayesinde, Şu anda uygulamanıza bir MapFragment eklemenin iki yolu vardır söyleyebilirim (Üzgünüm, aşağıya bakınız):

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

Bu sayede standart bir parça kullanmalı ve bunu içeride kullanmalısınız. Aslında başka bir fragmanı yerleştirilerek gibidir:

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

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

başka yolu olacaktır:

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

Bu durumda, bu şekilde gerçek SupportMapFragment kullanmak ve bunu uygulayabilirsiniz:

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

    getMapAsync(this); 
} 

ve mapView.onResume(); numaralarını içinde aramak zorunda kalmadan çalışırlar, yine de önerilmez.

Umut eder!

Güncelleme10: Bunu yayınladığımda iki yolu test ettim ve çalışıyorlardı, yemin ederim! İkinci seçeneği seçtim, neden bilmiyorum ama dün mapView aniden boş çıkıyor, hata veya istisna yok, ilk seçeneğe geçiş bunu düzeltdi. Google'a lanet! Niye ya?!