Добавить API Карт Google V2 в фрагмент

Я пытаюсь показать карту из API Карт Google V2 в фрагменте. Я попытался с поддержкой SupportMapFragment, но я не могу получить ожидаемый результат. Также я новичок на этой платформе! То, что я действительно хочу, это всего лишь способ поместить карту из Google Maps API V2 для Android в фрагмент. Пожалуйста, поделитесь своими идеями и ссылками.

Заранее спасибо !

Используйте SupportMapFragment вместо MapFragment и используйте getActivity()

Это базовый пример с использованием SupportMapFragment :

 public class MainActivity extends ActionBarActivity implements OnMapReadyCallback{ private SupportMapFragment map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); map.getMapAsync(this);//remember getMap() is deprecated! } @Override public void onMapReady(GoogleMap map) { map.moveCamera(CameraUpdateFactory.newLatLngZoom( new LatLng(47.17, 27.5699), 16)); map.addMarker(new MarkerOptions() .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)).anchor(0.0f, 1.0f) // Anchors the marker on the bottom left .position(new LatLng(47.17, 27.5699))); //Iasi, Romania map.setMyLocationEnabled(true); } } 

И измените ссылку в своем макете:

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

Вот код,

 public class YourFragment extends Fragment { // ... static final LatLng HAMBURG = new LatLng(53.558, 9.927); static final LatLng KIEL = new LatLng(53.551, 9.993); private GoogleMap map; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.yourlayout, null, false); map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG) .title("Hamburg")); Marker kiel = map.addMarker(new MarkerOptions() .position(KIEL) .title("Kiel") .snippet("Kiel is cool") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); // Move the camera instantly to hamburg with a zoom of 15. map.moveCamera(CameraUpdateFactory.newLatLngZoom(HAMBURG, 15)); // Zoom in, animating the camera. map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); //... return v; } 

Ваш макет,

  <RelativeLayout 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=".MainActivity" > <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment" /> </RelativeLayout> 

Внесите некоторые изменения в файл манифеста. Кроме того,

  <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myapp.android.locationapi.maps" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" /> <permission android:name="com.myapp.android.locationapi.maps.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <uses-permission android:name="com.myapp.android.locationapi.maps.permission.MAPS_RECEIVE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.myapp.android.locationapi.maps.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your_apikey" /> </application> </manifest> 
 public class DemoFragment extends Fragment { MapView mapView; GoogleMap map; LatLng CENTER = null; public LocationManager locationManager; double longitudeDouble; double latitudeDouble; String snippet; String title; Location location; String myAddress; String LocationId; String CityName; String imageURL; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater .inflate(R.layout.fragment_layout, container, false); mapView = (MapView) view.findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); setMapView(); } private void setMapView() { try { MapsInitializer.initialize(getActivity()); switch (GooglePlayServicesUtil .isGooglePlayServicesAvailable(getActivity())) { case ConnectionResult.SUCCESS: // Toast.makeText(getActivity(), "SUCCESS", Toast.LENGTH_SHORT) // .show(); // Gets to GoogleMap from the MapView and does initialization // stuff if (mapView != null) { locationManager = ((LocationManager) getActivity() .getSystemService(Context.LOCATION_SERVICE)); Boolean localBoolean = Boolean.valueOf(locationManager .isProviderEnabled("network")); if (localBoolean.booleanValue()) { CENTER = new LatLng(latitude, longitude); } else { } map = mapView.getMap(); if (map == null) { Log.d("", "Map Fragment Not Found or no Map in it!!"); } map.clear(); try { map.addMarker(new MarkerOptions().position(CENTER) .title(CityName).snippet("")); } catch (Exception e) { e.printStackTrace(); } map.setIndoorEnabled(true); map.setMyLocationEnabled(true); map.moveCamera(CameraUpdateFactory.zoomTo(5)); if (CENTER != null) { map.animateCamera( CameraUpdateFactory.newLatLng(CENTER), 1750, null); } // add circle CircleOptions circle = new CircleOptions(); circle.center(CENTER).fillColor(Color.BLUE).radius(10); map.addCircle(circle); map.setMapType(GoogleMap.MAP_TYPE_NORMAL); } break; case ConnectionResult.SERVICE_MISSING: break; case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: break; default: } } catch (Exception e) { } } 

In fragment_layout

 <com.google.android.gms.maps.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="160dp" android:layout_marginRight="10dp" /> 

Обновление 10/24/2014 Это все неправильно. Вы не должны иметь фрагмент в фрагменте. Скорее вы должны расширить SupportMapFragment. См. Этот столбец stackoverflow для некоторых деталей: https://stackoverflow.com/a/19815266/568197

Вот мой onDestroyView ()

 public void onDestroyView() { super.onDestroyView(); if (mMap != null) { getFragmentManager() .beginTransaction() .remove(getFragmentManager().findFragmentById(R.id.map)) .commit(); } } 

В дополнение к ответу выше, я также должен был привести следующие строки в мой манифест

 <!-- inside <aplication> tag --> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 

И я также изменил макет, чтобы использовать SupportMapFragment вместо MapFragment

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

Для всех тех друзей, которые сталкиваются с проблемой: –

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()

Попробуйте интегрировать GoogleMap с помощью кода

 FragmentManager fm = getChildFragmentManager(); googleMap = ((SupportMapFragment)fm.findFragmentById(R.id.googleMap)).getMap(); 

У меня та же проблема, я использую этот код, но я все еще получаю эту ошибку: невозможно создать экземпляр com.google.android.gsm.SupportMapFragment: убедитесь, что имя класса существует, является общедоступным и имеет пустую конструкцию или является общедоступной

Я решил это отсюда: как разместить Google Maps V2 на фрагменте с помощью ViewPager

Если вы используете Android-студию, создайте google mapsactivity свой фрагмент карты по умолчанию и создайте свой API-интерфейс карты и сделайте свой материал ……

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager (). FindFragmentById (R.id.map); mapFragment.getMapAsync (это);

И наш метод переопределения

Public void onMapReady (GoogleMap googleMap) {

  mMap = googleMap; LatLng map = new LatLng(lat, lon); mMap.addMarker(new MarkerOptions().position(map).title("your title")); mMap.animateCamera(CameraUpdateFactory.newLatLng(map)); mMap.setMapType(GoogleMap.MAP_TYPE_NONE); } 

Этот пример был создан из автоматически сгенерированного кода из студии Android, вам не нужно ничего менять в активности карт, только контекст в файле макета соответствует вашим картам. Активность

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1"> <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="300dp" tools:context="com.gearwell.app.gpsmaps02.Gpsenmapa" /> <LinearLayout android:id="@+id/layButtonH" android:layout_height="150dp" android:layout_marginTop="50dp" android:layout_width="fill_parent" android:gravity="center" android:layout_weight="0.15"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Obtener Ubicacion" android:id="@+id/btnLocation" android:onClick="onClick"/> </LinearLayout> </LinearLayout>