【问题标题】:How to get GoogleMap Reference - Android google map API如何获取 GoogleMap 参考 - Android google map API
【发布时间】:2023-03-17 16:14:01
【问题描述】:

我很难使用 google map Android API

情况是:我有一个父片段,其中包含对 MapFragment 的引用。 我的目标只是在地图上添加一些标记。

MapFragment 在 onViewCreated 方法中总是返回 null,这是意料之中的,因为此时 mapFragment 布局可能尚未完全加载。

void onViewCreated(){

   GoogleMap sMap = mapFragment.getMap(); //<---- always return null
   // add markers
   //.....
}

我尝试将 MapFragment.getMap() 放在 AysnkTask 中并使用 while 循环来尝试保存对地图的引用,但它不起作用。发生了一个奇怪的异常。

void onViewCreated(){
           AsyncTask<Object, Object, GoogleMap> loadInstruction = new AsyncTask<Object, Object, GoogleMap>(){

            @Override
            protected GoogleMap doInBackground(Object... params) {

                GoogleMap sMap = mapFragment.getMap();
                while(sMap == null) {
                    sMap = mapFragment.getMap();
                }
                return sMap;
            }

            @Override
            protected void onPostExecute(GoogleMap result) {
                //add Markers 
                                    //......
            }

        };

           loadInstruction.execute();

异常

06-23 11:28:05.754: I/dalvikvm(4129): Jit: resizing JitTable from 4096 to 8192
06-23 11:28:05.754: I/dalvikvm(4129): Jit: resizing JitTable from 4096 to 8192
06-23 11:28:05.764: E/AndroidRuntime(4129): FATAL EXCEPTION: main
06-23 11:28:05.764: E/AndroidRuntime(4129): Process: com.wenchao.map, PID: 4129
06-23 11:28:05.764: E/AndroidRuntime(4129): java.lang.NullPointerException
06-23 11:28:05.764: E/AndroidRuntime(4129):     at kbh.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at mbi.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at lxn.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at lxm.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at fnb.onTransact(SourceFile:107)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at   android.os.Binder.transact(Binder.java:361)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source)
 06-23 11:28:05.764: E/AndroidRuntime(4129):    at com.google.android.gms.maps.SupportMapFragment$a.onCreateView(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at com.google.android.gms.dynamic.a$4.b(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at com.google.android.gms.dynamic.a.a(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at com.google.android.gms.dynamic.a.onCreateView(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.os.Handler.handleCallback(Handler.java:733)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.os.Handler.dispatchMessage(Handler.java:95)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.os.Looper.loop(Looper.java:136)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at android.app.ActivityThread.main(ActivityThread.java:5001)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at java.lang.reflect.Method.invokeNative(Native Method)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at java.lang.reflect.Method.invoke(Method.java:515)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-23 11:28:05.764: E/AndroidRuntime(4129):     at dalvik.system.NativeStart.main(Native Method)
06-23 11:28:06.914: I/Process(4129): Sending signal. PID: 4129 SIG: 9

由于 getMap() 不能保证在任何时候都返回地图引用,并且没有钩子方法或某个地方让我注册回调。而且后台异步任务似乎不允许,如何确定何时调用 getMap() 并获取地图参考?

【问题讨论】:

    标签: android google-maps android-maps-v2


    【解决方案1】:

    在 onCreateView 上包含以下 sn-p 部分,这将解决您的问题,

       SupportMapFragment mFragment;
            mFragment = new SupportMapFragment() {
                @Override
                public void onActivityCreated(Bundle savedInstanceState) {
                    super.onActivityCreated(savedInstanceState);
                    if ((map = mFragment.getMap()) != null) {
                        setUpMap();
                    }
                }
            };
    

    一旦准备好地图,SuppotMapFragment 的 onActivityCreated 将在那里被调用,您可以设置地图。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      Google map v2 android method getMap() returns null

      上面链接中的解决方案对我有用。 虽然我没有找到文档说 getMap() 将在 onActivityCreated 中返回有用的地图引用,但在那里调用 getMap 似乎有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        相关资源
        最近更新 更多