7

Bir google harita bir etkinlik içinde bulunan bir Android parçasına yükleyebilirsiniz. Bu iyi çalışıyor.Yükleme Android Google Map parça yönetilen ViewPager

Ancak şimdi görünümler arasında gezinmek için ViewPager'ı kullanmak istiyorum (sınıf android.support.v4.app.Fragment). Böyle bir parçaya bir com.google.android.gms.maps.MapFragment yüklemek mümkün görünmüyor. Örneğin

:

SoleMap.java

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapFragment; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.model.LatLng; 

public class SoleMap extends Fragment implements OnMapReadyCallback { 

    MapFragment gMapFragment; 
    GoogleMap gMap = null; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.sole_map, container, false); 

     gMapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.soleViewMap); 
     gMapFragment.getMapAsync(this); 

     return view; 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     gMap = map; 
     gMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new 
       LatLng(49.39,-124.83), 20)); 
    } 

} 

ifadesi

getFragmentManager().findFragmentById(R.id.holeViewMap); 

bir derleyici hatası (uyumsuz türler) neden olur.

Bunun yerine, derleyici hatalarını ortadan kaldıran SupportMapFragment kullanmayı denedim, ancak uygulamayı çalıştırdığımda, "I/O Hatası: Bağlantı reddedildi" iletisiyle hemen çıkar. Google dokümanları, Destek kütüphanesini kullanmak için özel bir "For Work" hesabına ihtiyacınız olduğunu belirtir. Bu doğru mu? Eğer öyleyse, sanırım şansım yok.

Bunu yapmak için görebildiğim tek diğer yolu, görünümlerimi barındırmak için fragmanlar yerine etkinlik kullanmak, yani ViewPager'dan kurtulmaktır.

Herhangi bir öneriniz var mı? senin sole_map.xml Eğer en böyle bir şey diyelim, bir MapView eklemelisiniz yılında

+0

: http://stackoverflow.com/questions/19353255/how-to-put-google-maps-v2-on-a R.layout.fragment_map -

public class ScrollMapView extends MapView { public ScrollMapView(Context context, AttributeSet attributeSet) { super(context, attributeSet); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { /** * Request all parents to relinquish the touch events */ getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); } } 

son şey düzenidir -fragment-using-viewpager – Josef

+1

Bağlantı reddedildi: Bildiride Google Maps API anahtarınız var mı? –

+0

"Bağlantı reddedildi" sorunumun alakasız olduğunu düşünüyorum - muhtemelen kapatma/yeniden başlatmaya ihtiyaç duyan SDK'ya yapılan bir güncelleme ile ilgisi var. Sorunuza cevap vermek için, evet, daha önce çalışmış olduğum tezahürat (anahtar ile) vardı. – NLRicker

cevap

12

: Sonra

<?xml version="1.0" encoding="utf-8"?> 
<com.google.android.gms.maps.MapView 
    android:id="@+id/soleViewMap" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

Bu size MapView dönecektir id view.findViewById(R.id.soleViewMap); ile SoleMap fragmanından olsun, o zaman neler yapabileceğini sen Şimdi yapıyorsun. Bu gibi görünmelidir:

public class SoleMap extends Fragment implements OnMapReadyCallback { 

    MapView gMapView; 
    GoogleMap gMap = null; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.sole_map, container, false); 

    gMapView = (MapView) view.findViewById(R.id.soleViewMap); 
    gMapView.getMapAsync(this); 

    return view; 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
    gMap = map; 
    gMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
    gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new 
      LatLng(49.39,-124.83), 20)); 
    } 
} 

(bunlardan herhangi biri eksik değil umut) fragmanı yaşam döngüsü olaylarını onCreate, onLowMemory, , onResume ve onDestroy arayarak ile MapView ilişkilendirmek ve aramak unutma MapsInitializer.initialize(getContext()); yanı

+0

Halen bunu uygulamak için çalışıyorum ama yukarıdakilerin birini kullanması durumunda, bir düzeltme gerektirdiğine inanıyorum. FindFragmentById() yerine, findViewByID() kullanılmalıdır. Daha sonra derleyebildim. Bu şekilde çalışıp çalışamayacağımı göstermek için ASAP'a geri döneceğim. – NLRicker

+1

Haklısın, kötüyüm, düzeltmeyi bir an yapacağım. Teşekkürler! –

+0

Şimdi parçalarımdan biriyle ilgili bir harita alabiliyorum. Yukarıdaki genel düzeltme konusunda çok yardımcı oldu. Uygulama ayrıntılarıyla ilgili yardım için bkz. Https://gist.github.com/joshdholtz/4522551. Ayrıca MapView sınıfı için Android dokümanlar. – NLRicker

0
public class MapViewFragment extends Fragment implements OnMapReadyCallback{ 

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

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    //FragmentManager fragment = getActivity().getSupportFragmentManager(); 
    // Fragment fragment=(Fragment) getChildFragmentManager().findFragmentById(R.id.mapView); 
    final SupportMapFragment myMAPF = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map); 
    myMAPF.getMapAsync(this); 

} 

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

    // Add a marker in Sydney and move the camera 
    LatLng sydney = new LatLng(25.412383, 55.508085); 
    mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 
} 
0

Yaz sizin activity_maps.xml bu kod <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" />

6

Kabul bir swer iyi bir başlangıç ​​noktasıdır ama eğer kullanmaya çalışırsak başarısız olur, tam çözümü açıklamaz. (Fragmeny yaşam döngüsü haritayı kullanarak haber) ViewPager ve Tabs kullanılabilecek harita ile Tam çalışma parçası:

public class AttractionMapTabFragment extends AttractionTab implements OnMapReadyCallback { 

private ScrollMapView gMapView; 
private GoogleMap gMap; 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_map, null); 

    gMapView = (ScrollMapView) view.findViewById(R.id.map); 
    gMapView.getMapAsync(this); 

    //most important use onCreate; 
    gMapView.onCreate(getArguments()); 
    return view; 

} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    gMap = googleMap; 
    gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new 
      LatLng(51.3623329,21.7719342), 8)); 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    if (gMapView != null) 
     gMapView.onResume(); 
} 


@Override 
public void onDestroy() { 
    super.onDestroy(); 

    if (gMapView != null) 
     gMapView.onDestroy(); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    if (gMapView != null) 
     gMapView.onStart(); 
} 

@Override 
public void onStop() { 
    super.onStop(); 

    if (gMapView != null) 
     gMapView.onStop(); 

} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    if (gMapView != null) 
     gMapView.onSaveInstanceState(outState); 
} 
} 

Custom MapView sınıf - biz ebeveyn olarak ScrollView kullanıyorsanız gereklidir, bu hareket imkanı vermek map.If Bu ekranda ScrollView kullanmıyorsanız, standart MapView kullanılabilir.Bu deneyin

<?xml version="1.0" encoding="utf-8"?> 
<your.app.ScrollMapView 
android:id="@+id/map" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" />