为什么 Google 地图的 MapView 没有出现在我的 Android 片段中?
Why doesn't the MapView of Google Maps appear in my Android Fragment?
我想做的是在我单击 NavigationDrawer 中的列表项时显示 Google 地图视图。我设置它的方式是,每当我点击一个列表项时,当前片段就会被一个新片段替换。
因此,当我单击 "Find Stores" 列表项时,我的 StoreMapFragment 会替换当前片段。
我遇到的问题是 Google 徽标和放大和缩小按钮出现在屏幕底部,但实际地图本身不会显示。
我查看了 Google 地图 Android API v2 的许多指南以及 Whosebug 上提出的类似问题。我也尝试使用 activity 来执行此操作,但我得到了相同的结果。
起初,我没有在堆栈跟踪中看到任何错误。现在是这样说的:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fv4.app"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<permission
android:name="com.fv4.app.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.fv4.app.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Teatimefinal">
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyAxwMnDDx7pP23x3sB8ZqACsXC3MUDfE7c" />
</application>
</manifest>
StoreMapFragment.java
public class StoreMapFragment extends Fragment implements OnMapReadyCallback {
MapView mapView;
GoogleMap googleMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_store_map, container, false);
mapView = (MapView) view.findViewById(R.id.store_map_frag);
mapView.onCreate(savedInstanceState);
if (mapView != null) {
googleMap = mapView.getMap();
googleMap.getUiSettings().setMyLocationButtonEnabled(false);
// googleMap.setMyLocationEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
}
return view;
}
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
@Override
public void onResume() {
mapView.onResume();
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
}
布局XML:
<?xml version="1.0" encoding="utf-8"?>
<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" >
<com.google.android.gms.maps.MapView
android:id="@+id/store_map_frag"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
我的屏幕是这样的:
根据您的堆栈跟踪,您的 API 键发生了一些奇怪的事情。这似乎是一个很常见的问题。我自己不得不处理奇怪的 API 关键问题。 Link here 获取更多信息。
好的。我解决了这个问题。问题出在 SHA-1 指纹上。我意识到我使用了错误的 SHA-1。我实际上使用了 Google Maps Android API. So, I decided to look on Whosebug on how to get my own SHA-1, here: How to get the SHA-1 fingerprint certificate in Android Studio for debug mode?
中的示例 SHA-1
现在我可以看到地图了。
我想做的是在我单击 NavigationDrawer 中的列表项时显示 Google 地图视图。我设置它的方式是,每当我点击一个列表项时,当前片段就会被一个新片段替换。
因此,当我单击 "Find Stores" 列表项时,我的 StoreMapFragment 会替换当前片段。
我遇到的问题是 Google 徽标和放大和缩小按钮出现在屏幕底部,但实际地图本身不会显示。
我查看了 Google 地图 Android API v2 的许多指南以及 Whosebug 上提出的类似问题。我也尝试使用 activity 来执行此操作,但我得到了相同的结果。
起初,我没有在堆栈跟踪中看到任何错误。现在是这样说的:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fv4.app"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<permission
android:name="com.fv4.app.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.fv4.app.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Teatimefinal">
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyAxwMnDDx7pP23x3sB8ZqACsXC3MUDfE7c" />
</application>
</manifest>
StoreMapFragment.java
public class StoreMapFragment extends Fragment implements OnMapReadyCallback {
MapView mapView;
GoogleMap googleMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_store_map, container, false);
mapView = (MapView) view.findViewById(R.id.store_map_frag);
mapView.onCreate(savedInstanceState);
if (mapView != null) {
googleMap = mapView.getMap();
googleMap.getUiSettings().setMyLocationButtonEnabled(false);
// googleMap.setMyLocationEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
}
return view;
}
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker"));
}
@Override
public void onResume() {
mapView.onResume();
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
}
布局XML:
<?xml version="1.0" encoding="utf-8"?>
<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" >
<com.google.android.gms.maps.MapView
android:id="@+id/store_map_frag"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
我的屏幕是这样的:
根据您的堆栈跟踪,您的 API 键发生了一些奇怪的事情。这似乎是一个很常见的问题。我自己不得不处理奇怪的 API 关键问题。 Link here 获取更多信息。
好的。我解决了这个问题。问题出在 SHA-1 指纹上。我意识到我使用了错误的 SHA-1。我实际上使用了 Google Maps Android API. So, I decided to look on Whosebug on how to get my own SHA-1, here: How to get the SHA-1 fingerprint certificate in Android Studio for debug mode?
中的示例 SHA-1现在我可以看到地图了。