Intereting Posts
Как программно изменить фрагмент на FragmentPagerAdapter? Компоненты архитектуры Android с MVP Почему иногда сохраняется сохранение Hashtable объектов, не являющихся объектами в onSaveInstanceState ()? Android: нарисуйте «нерегулярные» штрихи на холсте, вид мела на доске Как разделить объект между двумя потоками (синхронизация потоков)? Как реализовать uncaughtException android Узел сбора мусора в Android запущен, но ничто не отображается как выделенное в трекере распределения ddms Значок «Левое меню» на панели действий в Android Как передать параметр в подкласс BroadcastReceiver? RecyclerView с LinearLayoutManager с заголовком, который не перерабатывается Настройки Android Wear Watchface на хосте Обнаружение жестов на фрагменте Android: файл Epub, не отображающий изображения в эмуляторе / устройстве Android Как использовать Android ViewPager? Возможно ли создать службу Android, которая прослушивает аппаратные нажатия клавиш?

Как разместить Google Maps V2 на фрагменте с помощью ViewPager

Я пытаюсь сделать макет вкладки в Play Маркете. Мне нужно отобразить макет вкладки, используя фрагменты и viewpager из androidhive. Тем не менее, я не могу реализовать google maps v2 на нем. Я уже несколько часов обыскал интернет, но я не могу найти учебник о том, как это сделать. Может кто-нибудь, пожалуйста, покажи мне, как это сделать. Благодаря!

Используя этот код, мы можем настроить MapView где угодно, внутри любого ViewPager или Fragment или Activity.

В последнем обновлении Google for Maps поддерживается только MapView для фрагментов. MapFragment & SupportMapFragment не работает. Возможно, я ошибаюсь, но это то, что я видел после попытки реализовать MapFragment & SupportMapFragment.

Настройка макета для отображения карты. Location_fragment.xml :

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.google.android.gms.maps.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> 

Теперь мы кодируем класс java для отображения Карты. MapViewFragment :

 public class MapViewFragment extends Fragment { MapView mMapView; private GoogleMap googleMap; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.location_fragment, container, false); mMapView = (MapView) rootView.findViewById(R.id.mapView); mMapView.onCreate(savedInstanceState); mMapView.onResume(); // needed to get the map to display immediately try { MapsInitializer.initialize(getActivity().getApplicationContext()); } catch (Exception e) { e.printStackTrace(); } mMapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap mMap) { googleMap = mMap; // For showing a move to my location button googleMap.setMyLocationEnabled(true); // For dropping a marker at a point on the Map LatLng sydney = new LatLng(-34, 151); googleMap.addMarker(new MarkerOptions().position(sydney).title("Marker Title").snippet("Marker Description")); // For zooming automatically to the location of the marker CameraPosition cameraPosition = new CameraPosition.Builder().target(sydney).zoom(12).build(); googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); } }); return rootView; } @Override public void onResume() { super.onResume(); mMapView.onResume(); } @Override public void onPause() { super.onPause(); mMapView.onPause(); } @Override public void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mMapView.onLowMemory(); } } 

Наконец, вам нужно получить API-ключ для своего приложения, зарегистрировав свое приложение в Google Cloud Console . Зарегистрируйте свое приложение как приложение для Android.

Для меня работает следующий подход.

 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.MapView; import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; /** * A fragment that launches other parts of the demo application. */ public class MapFragment extends Fragment { MapView mMapView; private GoogleMap googleMap; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // inflat and return the layout View v = inflater.inflate(R.layout.fragment_location_info, container, false); mMapView = (MapView) v.findViewById(R.id.mapView); mMapView.onCreate(savedInstanceState); mMapView.onResume();// needed to get the map to display immediately try { MapsInitializer.initialize(getActivity().getApplicationContext()); } catch (Exception e) { e.printStackTrace(); } googleMap = mMapView.getMap(); // latitude and longitude double latitude = 17.385044; double longitude = 78.486671; // create marker MarkerOptions marker = new MarkerOptions().position( new LatLng(latitude, longitude)).title("Hello Maps"); // Changing marker icon marker.icon(BitmapDescriptorFactory .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); // adding marker googleMap.addMarker(marker); CameraPosition cameraPosition = new CameraPosition.Builder() .target(new LatLng(17.385044, 78.486671)).zoom(12).build(); googleMap.animateCamera(CameraUpdateFactory .newCameraPosition(cameraPosition)); // Perform any camera updates here return v; } @Override public void onResume() { super.onResume(); mMapView.onResume(); } @Override public void onPause() { super.onPause(); mMapView.onPause(); } @Override public void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mMapView.onLowMemory(); } } 

fragment_location_info.xml

 <?xml version="1.0" encoding="utf-8"?> <com.google.android.gms.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" /> 

Вы можете использовать эту строку, если хотите использовать GoogleMap в фрагменте:

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

 GoogleMap mGoogleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap(); 

Последний материал с getMapAsync вместо устаревшего.

1. проверить манифест для

 <meta-data android:name="com.google.android.geo.API_KEY" android:value="xxxxxxxxxxxxxxxxxxxxxxxxx"/> 

Вы можете получить ключ API для своего приложения, зарегистрировав свое приложение в Google Cloud Console . Зарегистрируйте свое приложение как приложение для Android

2. в вашем макете фрагмента .xml добавить FrameLayout (а не фрагмент):

  <FrameLayout android:layout_width="match_parent" android:layout_height="250dp" android:layout_weight="2" android:name="com.google.android.gms.maps.SupportMapFragment" android:id="@+id/mapwhere" /> 

Или какую бы высоту вы ни хотели

3. В onCreateView в фрагменте

  private SupportMapFragment mSupportMapFragment; mSupportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapwhere); if (mSupportMapFragment == null) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); mSupportMapFragment = SupportMapFragment.newInstance(); fragmentTransaction.replace(R.id.mapwhere, mSupportMapFragment).commit(); } if (mSupportMapFragment != null) { mSupportMapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { if (googleMap != null) { googleMap.getUiSettings().setAllGesturesEnabled(true); -> marker_latlng // MAKE THIS WHATEVER YOU WANT CameraPosition cameraPosition = new CameraPosition.Builder().target(marker_latlng).zoom(15.0f).build(); CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition); googleMap.moveCamera(cameraUpdate); } } }); 

Для получения получения NullPointerException при изменении вкладок в FragmentTabHost вам просто нужно добавить этот код в свой класс с TabHost . Я имею в виду класс, в котором вы инициализируете вкладки. Это код:

 /**** Fix for error : Activity has been destroyed, when using Nested tabs * We are actually detaching this tab fragment from the `ChildFragmentManager` * so that when this inner tab is viewed back then the fragment is attached again****/ import java.lang.reflect.Field; @Override public void onDetach() { super.onDetach(); try { Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } 
 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" /> 

Когда вы добавляете использование карты yor:

 getChildFragmentManager().beginTransaction() .replace(R.id.menu_map_container, mapFragment, "f" + shabbatIndex).commit(); 

Вместо .add и вместо getFragmentManager .

Вот что я сделал подробно:

Отсюда вы можете получить ключ google map api key

Альтернативный и простой способ

Сначала войдите в свою учетную запись google и посетите google-библиотеки и выберите Google Maps Android API

Зависимость, найденная в деятельности по умолчанию по умолчанию для андроид-студии:

 compile 'com.google.android.gms:play-services:10.0.1' 

Поместите свой ключ в файл манифеста андроида под приложением, как показано ниже

В AndroidMainifest.xml выполните следующие изменения:

  // required permission <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> // google map api key put under/inside <application></application> // android:value="YOUR API KEY" <meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzasdfasdf645asd4f847sad5f45asdf7845" /> 

Код фрагмента:

 public class MainBranchFragment extends Fragment implements OnMapReadyCallback{ private GoogleMap mMap; public MainBranchFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view= inflater.inflate(R.layout.fragment_main_branch, container, false); SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.main_branch_map); mapFragment.getMapAsync(this); return view; } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; LatLng UCA = new LatLng(-34, 151); mMap.addMarker(new MarkerOptions().position(UCA).title("YOUR TITLE")).showInfoWindow(); mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(UCA,17)); } } 

В вас фрагмент xml:

 <fragment android:id="@+id/main_branch_map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.googlemap.googlemap.MapsActivity" /> 

У меня есть обходное решение для NullPointerException при удалении фрагмента в DestoryView , просто поместите свой код в onStop() не onDestoryView . Он отлично работает!

 @Override public void onStop() { super.onStop(); if (mMap != null) { MainActivity.fragmentManager.beginTransaction() .remove(MainActivity.fragmentManager.findFragmentById(R.id.location_map)).commit(); mMap = null; } } 

Согласно https://developer.android.com/about/versions/android-4.2.html#NestedFragments , вы можете использовать вложенные фрагменты, чтобы достичь этого, вызвав getChildFragmentManager (), если вы все еще хотите использовать фрагмент Google Maps вместо Просмотр внутри вашего собственного фрагмента:

 SupportMapFragment mapFragment = new SupportMapFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.content, mapFragment).commit(); 

Где «контент» – это корневая компоновка вашего фрагмента (предпочтительно FrameLayout). Преимущество использования фрагмента карты состоит в том, что тогда жизненный цикл карты управляется автоматически системой.

Хотя в документации говорится: «Вы не можете раздувать макет во фрагмент, если этот макет включает <фрагмент>. Вложенные фрагменты поддерживаются только при добавлении к фрагменту динамически». Я как-то успешно это сделал, и он работал нормально. Вот мой код:
В методе onCreateView () фрагмента:

 View view = inflater.inflate(R.layout.layout_maps, container, false); SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); mapFragment.getMapAsync(...); 

В макете:

 <fragment xmlns:android="http://schemas.android.com/apk/res/android" 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" /> 

Надеюсь, поможет!