gpt4 book ai didi

android - 如何使用Google Map的V2 MapView for Android来显示actionbar?

转载 作者:行者123 更新时间:2023-11-29 14:24:21 24 4
gpt4 key购买 nike

我试图在 Google map 上方显示操作栏,但我意识到一旦 Google map 打开,它就不会使用我的应用程序,而是使用 Google 的应用程序,因此标题栏会消失。

我知道使用 MapView 可以实现此目的,但我不确定如何从使用 fragment 过渡到 MapView,因为我收到了 NullPointerException

这是 AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.test" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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/logo"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<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="@string/google_maps_key" />

<activity
android:name=".MapActivity"
android:label="@string/title_activity_map" >
</activity>

</application>

</manifest>

我的 activity_map.xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
tools:context="org.test.MapActivity"
android:name="com.google.android.gms.maps.SupportMapFragment"
map:cameraTargetLat="35.25215"
map:cameraTargetLng="-112.24659"
map:uiTiltGestures="true"
map:uiZoomGestures="true"
map:uiZoomControls="true" />

我的 activity_mapview.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

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

</LinearLayout>

我的 MapActivity.java:

public class MapActivity extends FragmentActivity {
private GoogleMap mMap;
private MapView mapView;
private Marker marker;

private static final LatLng ONE = new LatLng(32.882216, -117.222028);
private static final LatLng TWO = new LatLng(32.872000, -117.232004);
private static final LatLng THREE = new LatLng(32.880252, -117.233034);
private static final LatLng FOUR = new LatLng(32.885200, -117.226003);

private ArrayList<LatLng> coords = new ArrayList<LatLng>();
private static final int POINTS = 4;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mapview);
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);

setUpMapIfNeeded();
}

@Override
protected void onStop() {
super.onStop();
}

@Override
protected void onResume() {
super.onResume();
mapView.onResume();
setUpMapIfNeeded();
}

@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}

@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}

@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}

private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
Log.d("Test", "GO HERE");
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
Log.d("Test", "GO THERE");
if (mMap != null) {
coords.add(ONE);
coords.add(TWO);
coords.add(THREE);
coords.add(FOUR);

setUpMap();
}
}
}

private void setUpMap() {
for (int i = 0; i < POINTS; i++) {
mMap.addMarker(new MarkerOptions().position(coords.get(i))
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
}
}
}

样式.xml:

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>

<style name="FullscreenTheme" parent="android:Theme.NoTitleBar">
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@null</item>
<item name="metaButtonBarStyle">@style/ButtonBar</item>
<item name="metaButtonBarButtonStyle">@style/ButtonBarButton</item>
</style>

<!-- Backward-compatible version of ?android:attr/buttonBarStyle -->
<style name="ButtonBar">
<item name="android:paddingLeft">2dp</item>
<item name="android:paddingTop">5dp</item>
<item name="android:paddingRight">2dp</item>
<item name="android:paddingBottom">0dp</item>
<item name="android:background">@android:drawable/bottom_bar</item>
</style>

<!-- Backward-compatible version of ?android:attr/buttonBarButtonStyle -->
<style name="ButtonBarButton" />

基于做一些日志语句,它看起来好像 GO HERE 被打印出来但它永远不会到达 GO THERE,所以问题出在下面的代码中,但我不确定如何修复它,因为我是 Android 编程的新手:

mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();

日志:

08-21 01:29:20.593  30698-30698/org.test E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{org./org.test.MapActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at
org.test.MapActivity.setUpMapIfNeeded(MapActivity.java:183)
at
org.test.MapActivity.onCreate(MapActivity.java:77)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
            at android.app.ActivityThread.access$1500(ActivityThread.java:117)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:130)
            at android.app.ActivityThread.main(ActivityThread.java:3683)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:507)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
            at dalvik.system.NativeStart.main(Native Method)

谢谢。

最佳答案

在你的build.gradle中定义依赖

compile 'com.android.support:appcompat-v7:23.0.0'
compile 'com.google.android.gms:play-services:7.8.0'

要获取标题,请从 AppCompatActivity 扩展您的 Activity 并使用 setTitle() 设置标题

对于使用 MapView,您不需要在 onResume 中进行任何检查。
只需在 onCreate 中通过异步方法获取您的 map 。
setUpMap 方法将在 map 准备就绪时调用。

public class MapActivity extends AppCompatActivity {
private GoogleMap mMap;
private MapView mapView;
private Marker marker;

private static final LatLng ONE = new LatLng(32.882216, -117.222028);
private static final LatLng TWO = new LatLng(32.872000, -117.232004);
private static final LatLng THREE = new LatLng(32.880252, -117.233034);
private static final LatLng FOUR = new LatLng(32.885200, -117.226003);

private ArrayList<LatLng> coords = new ArrayList<LatLng>();
private static final int POINTS = 4;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mapview);
setTitle("My Map");
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
setUpMap(googleMap);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
private void setUpMap(GoogleMap map) {
mMap = map;

coords.add(ONE);
coords.add(TWO);
coords.add(THREE);
coords.add(FOUR);
for (int i = 0; i < POINTS; i++) {
mMap.addMarker(new MarkerOptions()
.position(coords.get(i))
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
}
}
}

关于android - 如何使用Google Map的V2 MapView for Android来显示actionbar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32136078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com