【问题标题】:Android SupportMapFragment Exception ErrorAndroid SupportMapFragment 异常错误
【发布时间】:2012-11-25 16:49:24
【问题描述】:

我正在尝试使用新的 Google Play 服务库并将地图嵌入到地图片段中,如下所示

PlaceMapsFragment.java

public class PlaceMapsFragment extends SupportMapFragment {
    private GoogleMap mMap;
    private LatLng mPosFija;

    public PlaceMapsFragment() {
        super();
    }

    public static PlaceMapsFragment newInstance(LatLng posicion) {
        PlaceMapsFragment frag = new PlaceMapsFragment();
        frag.mPosFija = posicion;
        return frag;
    }

    @Override
    public GoogleMap getMap() {
        // TODO Auto-generated method stub
        return super.getMap();
    }

    @Override
    public void onCreate(Bundle arg0) {
        // TODO Auto-generated method stub
        super.onCreate(arg0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        //initMap();
        return view;
    }

    private void initMap() {
        UiSettings settings = getMap().getUiSettings();
        settings.setAllGesturesEnabled(false);
        settings.setMyLocationButtonEnabled(false);

        getMap().moveCamera(CameraUpdateFactory.newLatLngZoom(mPosFija, 16));
        getMap().addMarker(
                new MarkerOptions().position(mPosFija)
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.drawable.marker)));
    }

}

错误

12-10 01:44:54.416: E/AndroidRuntime(32716): FATAL EXCEPTION: main
12-10 01:44:54.416: E/AndroidRuntime(32716): java.lang.NullPointerException
12-10 01:44:54.416: E/AndroidRuntime(32716):    at maps.ar.b.a(Unknown Source)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at maps.y.h.a(Unknown Source)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at maps.y.au.a(Unknown Source)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at maps.y.ae.moveCamera(Unknown Source)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.google.android.gms.maps.internal.IGoogleMapDelegate$Stub.onTransact(IGoogleMapDelegate.java:83)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.os.Binder.transact(Binder.java:297)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.moveCamera(Unknown Source)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.google.android.gms.maps.GoogleMap.moveCamera(Unknown Source)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.m7.nomad.PlaceMapsFragment.initMap(PlaceMapsFragment.java:55)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.m7.nomad.PlaceMapsFragment.onCreateView(PlaceMapsFragment.java:46)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.m7.nomad.PlaceActivity$TabManager.onTabChanged(PlaceActivity.java:153)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:379)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.widget.TabHost.setCurrentTab(TabHost.java:364)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.view.View.performClick(View.java:3591)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.view.View$PerformClick.run(View.java:14263)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.os.Handler.handleCallback(Handler.java:605)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.os.Looper.loop(Looper.java:137)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at android.app.ActivityThread.main(ActivityThread.java:4507)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at java.lang.reflect.Method.invoke(Method.java:511)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
12-10 01:44:54.416: E/AndroidRuntime(32716):    at dalvik.system.NativeStart.main(Native Method)

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.m7.nomad"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <permission
        android:name="com.example.newmapview.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.example.newmapview.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Sherlock" >
        <activity
            android:name="com.m7.nomad.SplashActivity"
            android:label="@string/app_name" >
        </activity>
        <activity
            android:name="com.m7.nomad.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.m7.nomad.PlaceActivity"
            android:label="@string/app_name" >
        </activity>

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="XXXXXXXXXXX" />
    </application>

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

</manifest>

我有一个 SherlockFragmentActivity,它有一个 TabHost,它附有两个 Fragment。我正在尝试在其中一个标签片段中渲染地图

编辑

我已显示地图,但现在我无法引用地图并将地图更改为混合。基本上我需要引用地图而不会出现 Null 错误。

【问题讨论】:

  • stackoverflow.com/questions/13719263/…。简而言之,您需要将整个文件夹 google-play-services_lib 添加为模块,而不仅仅是 google-play-services.jar。
  • @jumper0k 我已经添加了
  • 现在在您的 xml 中,您正在使用 MapView,而在 setUpMapIfNeeded 的代码中,您正试图通过 id 查找片段。您应该通过 id 找到视图。对于 MapView,请参见示例“原始 MapView”
  • @jumper0k 我只是在尝试。当我在 RawMap 中使用代码时,我得到了 findViewById(int) 方法的类型未定义

标签: android android-support-library google-play-services mapfragment supportmapfragment


【解决方案1】:

onCreateView() 中,您必须调用其父级。在https://stackoverflow.com/a/13734470/835787 中查看我的 解决方案。地图是在 MapFragment 的 onCreateView() 方法中初始化的,如果不调用它就会为空。

【讨论】:

  • 我认为我遗漏了一些东西。当我选择地图选项卡时,我正在加载 PlaceMapsFragment。所以我不确定我也应该参考哪个父母。你能指出你指的是哪一行吗?
  • 我已经更新了问题中的代码。如果我在正确的轨道上,请指导
  • Sloy:我让地图工作了。但现在我需要引用地图视图并向地图添加功能。如何在 SupportMapFragment 中设置 Ceter 或更改 MAp 类型。我使用了与你相同的代码,但我仍然面临空指针异常。
  • 在我的代码中,当 initMap() 在 onCreateView() 内部执行时,地图已经初始化(因为我首先调用了 super.onCreateView())。然后,您可以对地图做任何您需要做的事情。在我的代码中,我将一些设置更改为手势和相机位置,并添加了一个标记。查看该类的文档,看看你能用它做什么。
  • 我想我不需要覆盖 onCreateView() 并通过 onCreate() 执行它仍然我得到同样的错误。知道如何在扩展 SupportMapFragment 的类中启动它
【解决方案2】:
  1. super.onCreate(savedInstanceState);应该在 onCreate() 中调用,而不是 onCreateView()
  2. 如果你想重写 onCreateView(),它应该是这样的:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = super.onCreateView(inflater, container, savedInstanceState);
    
        // Do any other initialization you need, but note that the MapView already exists inside v
    
        setUpMapIfNeeded(v);
        return v;
    }
    

【讨论】:

  • 如何在同一个视图中设置?
  • 当我没有提到布局或初始化 MapView 时,我如何获得对它的引用
  • SupportMapFragment 已经设置了自己的视图。如果要添加自己的视图,可以保留对 super.onCreateView() 的返回值的引用。您不需要对 MapView 的引用。只是 GoogleMap,您可以通过在片段上调用 ​​getMap() 来获得它。
  • 非常感谢。我简化了布局并删除了对地图的所有引用,它开始工作了。现在,如果我想将地图设置为不同类型的地图,我该如何引用地图?如果我尝试这样做,我会收到一个 null 错误
【解决方案3】:

我不知道它是否有帮助,但您应该在此处设置 您的包:

    <permission
    android:name="com.example.newmapview.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.example.newmapview.permission.MAPS_RECEIVE" />

【讨论】:

  • 该死的。那是我的愚蠢。但我仍然得到一个空指针异常。我主要是想弄清楚如何通过代码将地图填充到布局中
  • 为了将地图填充到布局中,请尝试使用 MapView。
  • 你的意思是这样的?我还需要在这里添加 api 密钥吗? schemas.android.com/apk/res/android" android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true " android:apiKey="你的 API 密钥" />
  • 不,这是旧 API。这是新的: schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" /> 查看您的 google_play_services 文件夹中的地图示例。
  • 似乎不起作用。更新了我的代码和错误信息。在试图弄清楚如何让它工作之后。所有演示都使用 FragmentActitivty,但没有一个是通过 SupportFragmentActivity 进行的。我正在使用 Fragment,因为我在 TabHost 中填充了 Map,该 TabHost 托管了两个 Fragmetns
【解决方案4】:

我通过在导入 Google Play 服务库时选中“Copy projects into workspace”解决了这个错误。
更多信息在这里:http://developer.android.com/google/play-services/setup.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多