如何在 Fragment 中获取 Google Maps 对象
Posted
技术标签:
【中文标题】如何在 Fragment 中获取 Google Maps 对象【英文标题】:How to get Google Maps object inside a Fragment 【发布时间】:2014-03-28 18:36:04 【问题描述】:我在我的应用程序中使用片段,我对此并不陌生。有一个片段,我想在其中显示谷歌地图并想要获取它的对象,为此我在我的 XML 中有一个片段,我想在片段本身中膨胀它。当我尝试为地图视图充气时,它向我显示 getSupportFragmentManager() 的错误。
如何获取地图对象是主要问题。我的 XML 是这样的:-
<fragment
android:id="@+id/map"
android:layout_
android:layout_
class="com.google.android.gms.maps.SupportMapFragment" />
我想在其中获取 Google Map 对象的片段是这样的:-
public class FindMyCar extends Fragment
private TextView mTvFind;
private TextView mTvPark;
private EditText mEtParkHint;
private GoogleMap map;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.findmycar, null);
initViews(view);
Typeface type = Typeface.createFromAsset(getActivity().getResources().getAssets(),"Multicolore.otf");
mTvFind.setTypeface(type);
mTvPark.setTypeface(type);
mEtParkHint.setTypeface(type);
SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
return view;
@Override
public void onDestroyView()
super.onDestroyView();
@Override
public void onDestroy()
super.onDestroy();
private void initViews(View view)
mTvPark = (TextView) view.findViewById(R.id.tvFindCarPark);
mTvFind = (TextView) view.findViewById(R.id.tvFindCar);
mEtParkHint = (EditText) view.findViewById(R.id.etParkHint);
谁能帮我获取地图的对象,以便我可以显示当前位置并在那里绘制标记。
任何帮助都将不胜感激。 提前致谢。
【问题讨论】:
【参考方案1】:getMap() 方法已弃用
getMap()
方法已被弃用,但在 play-services 9.2
它被删除之后,所以最好使用 getMapAsync()。仅当您不愿意为您的应用更新 play-services 9.2
时,您仍然可以使用 getMap()。
要使用getMapAsync()
,请在您的活动或片段上实现OnMapReadyCallback
接口:
对于片段:
public class MapFragment extends android.support.v4.app.Fragment
implements OnMapReadyCallback /* ... */
然后,在初始化地图时,使用getMapAsync()
而不是getMap()
:
//call this method in your onCreateMethod
private void initializeMap()
if (mMap == null)
SupportMapFragment mapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_map);
mapFrag.getMapAsync(this);
@Override
public void onMapReady(GoogleMap googleMap)
mMap = googleMap;
setUpMap();// do your map stuff here
对于活动:
public class MapActivity extends FragmentActivity
implements OnMapReadyCallback
Then, while initializing the map, use getMapAsync() instead of getMap():
//call this method in your onCreateMethod
private void initializeMap()
if (mMap == null)
SupportMapFragment mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_map);
mapFrag.getMapAsync(this);
@Override
public void onMapReady(GoogleMap googleMap)
mMap = googleMap;
setUpMap();// do your map stuff here
XML 中的片段:
<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_
android:layout_/>
【讨论】:
你能贴一下xml代码吗?我的片段代码出现此错误: com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' 在空对象引用上 这个答案是正确,但你应该知道,在Activity中,你必须从FragmentActivity扩展,否则会出问题【参考方案2】:试试这个
GoogleMap map = ((SupportMapFragment) getFragmentManager()
.findFragmentById(R.id.map)).getMap();
在你的 xml 中
<fragment
android:id="@+id/map"
android:layout_
android:layout_
class="com.google.android.gms.maps.SupportMapFragment" />
【讨论】:
getMap() 已弃用。任何可能的解决方案? getMapAsync(试试这个对我有用 How to put Google Maps V2 on a Fragment Using ViewPager
<Fragment
android:id="@+id/map"
android:layout_
android:layout_
class="com.google.android.gms.maps.SupportMapFragment" />
GoogleMap mGoogleMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap();
【讨论】:
【参考方案4】:试试这个,我根据您的需要制作了这个作为样品
public class LocationMapActivity extends FragmentActivity
private GoogleMap mMap;
static boolean Iscamera = false;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.locatio_map);
setUpMapIfNeeded();
@Override
protected void onResume()
super.onResume();
setUpMapIfNeeded();
private void setUpMapIfNeeded()
if (mMap == null)
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
mMap.setMyLocationEnabled(true);
if (mMap != null)
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setCompassEnabled(true);
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getMaxZoomLevel();
mMap.getMinZoomLevel();
mMap.getUiSettings();
mMap.animateCamera(CameraUpdateFactory.zoomIn());
mMap.animateCamera(CameraUpdateFactory.zoomOut());
mMap.animateCamera(CameraUpdateFactory.zoomTo(20));
mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener()
@Override
public void onMyLocationChange(Location arg0)
// TODO Auto-generated method stub
mMap.clear();
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(arg0.getLatitude(), arg0
.getLongitude()))
.title("I am Here!!")
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.map_icon)));
if (!Iscamera)
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(arg0.getLatitude(), arg0
.getLongitude()), 14));
Iscamera = true;
try
if (Constant.FORTNAME.equals("Arad Fort"))
mMap.addMarker(new MarkerOptions()
.position(new LatLng(26.2525, 50.6269))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
else if (Constant.FORTNAME.equals("Bahrain Fort"))
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(26.2333598,
50.52035139))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
else if (Constant.FORTNAME
.equals("International Circuit"))
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(26.0303251,
50.51121409))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
else if (Constant.FORTNAME
.equals("Khamis Mousque"))
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(26.158719, 50.516426))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
else if (Constant.FORTNAME
.equals("king fahad causeway"))
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(26.1723987,
50.4579942))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
else if (Constant.FORTNAME.equals("Riffa Fort"))
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(26.11771965026855,
50.56298065185547))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
else if (Constant.FORTNAME
.equals("Royal Golf Club"))
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(26.13000, 50.55500))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
else if (Constant.FORTNAME.equals("Tree of life"))
mMap.addMarker(new MarkerOptions()
.position(
new LatLng(25.9940396,
50.583135500000026))
.title(Constant.FORTNAME)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.greenicon)));
catch (Exception e)
Toast.makeText(getApplicationContext(),
e.getMessage(), Toast.LENGTH_LONG).show();
Log.e(e.getClass().getName(), e.getMessage(), e);
);
// ********************************************************************************************
@SuppressWarnings("unused")
private void setUpMap()
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title(
"Marker"));
【讨论】:
希望对您有所帮助!! 但这是针对 FragmentActivity 而不是 Fragment【参考方案5】:public class MapActivity extends FragmentActivity
implements OnMapReadyCallback
Then, while initializing the map, use getMapAsync() instead of getMap():
//call this method in your onCreateMethod
private void initializeMap()
if (mMap == null)
SupportMapFragment mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_map);
mapFrag.getMapAsync(this);
@Override
public void onMapReady(GoogleMap googleMap)
mMap = googleMap;
您可以使用它来制作地图,但它会返回地图对象为空,因为您找不到使用 getMapAsync 来创建新对象 mMap 的解决方案。它只是返回 null 的后台任务
【讨论】:
【参考方案6】:<fragment
android:layout_
android:layout_
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/location_map"
android:layout_above="@id/atmLocation_recyclerView"
/>
View root= inflater.inflate(R.layout.fragment_a_t_m_locations, container, false);
SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.location_map);
mapFragment.getMapAsync(googleMap ->
mMap=googleMap;
if(mMap!=null)
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
);
【讨论】:
【参考方案7】:修改后的代码:
您的 xml 文件-
<fragment
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_
android:layout_/>
您的 java 文件(仅相关代码)-
View view = null, mapView = null;
private GoogleMap mMap;
view = inflater.inflate(R.layout.findmycar, container,false);
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager
.findFragmentById(R.id.map);
mMap = supportMapFragment.getMap();
mapView = (View) view.findViewById(R.id.map);
【讨论】:
以上是关于如何在 Fragment 中获取 Google Maps 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Fragment 中实现 Google Maps 并使用 GoogleMap 对象?
android ViewPager+Fragment 如何在ViewPager的Activity中获取Fragment中的控件对象
如何在activity中获取fragment的控件,然后修改控件的内容,