如何使用android.app.Fragment库实现Fragment内的地图功能?
使用android.app.Fragment实现Google Maps功能
我明白你现在想从基于support.fragment的地图实现切换到原生android.app.Fragment库——确实大部分示例都偏向于支持库,但原生实现其实也很直接,只需要做几个关键调整就行:
1. 布局文件调整
把布局里的SupportMapFragment替换成原生的MapFragment,对应的类路径是com.google.android.gms.maps.MapFragment:
<fragment android:id="@+id/mapFragment" class="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent" />
2. 实现类代码调整
你的TrackFragment需要继承android.app.Fragment(而非支持库的Fragment),然后通过getFragmentManager()(如果地图Fragment直接在Activity布局中)或者getChildFragmentManager()(如果地图Fragment嵌套在当前Fragment中,需API 17及以上支持)来获取MapFragment实例:
public class TrackFragment extends android.app.Fragment { private GoogleMap mMap; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.your_fragment_layout, container, false); // 获取MapFragment实例 MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.mapFragment); // 异步获取GoogleMap对象,避免阻塞UI mapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // 在这里完成地图初始化操作,比如设置摄像头位置、添加标记等 LatLng targetLocation = new LatLng(39.9042, 116.4074); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(targetLocation, 12)); mMap.addMarker(new MarkerOptions().position(targetLocation).title("北京")); } }); return rootView; } }
关键注意点
- API版本兼容:
android.app.Fragment从API 11开始引入,getChildFragmentManager()需要API 17及以上支持,如果你的应用需要兼容更低版本,可能需要额外处理,但目标API在17+的话这个实现完全可用。 - 依赖配置不变:你仍然需要在项目的
build.gradle中引入Google Maps服务依赖,示例如下:implementation 'com.google.android.gms:play-services-maps:18.1.0' - 权限与密钥:别忘了在
AndroidManifest.xml中添加必要的位置权限和Maps API密钥:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <application> <meta-data android:name="com.google.android.geo.API_KEY" android:value="你的Maps API密钥"/> </application>
这样调整后,你的原生Fragment就能正常加载并使用Google Maps功能了。
内容的提问来源于stack exchange,提问作者Prabs
相关产品推荐
相关产品推荐

