Как получить Справочник GoogleMap - API Google Map для Android

Я изо всех сил пытался использовать Google Map Android API

Ситуация такова: у меня есть родительский фрагмент, который содержит ссылку на MapFragment. Моя цель - просто добавить несколько маркеров на карту.

MapFragment всегда возвращает значение null в методе onViewCreated, что ожидается, поскольку макет 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 () и получать ссылку на карту?

2 ответа

Решение

Включите этот фрагмент кода в onCreateView, который решит вашу проблему,

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

Как только карта подготовлена, будет вызван метод onActivityCreated SuppotMapFragment, и вы сможете настроить карту.

Надеюсь это поможет

Google map v2 android метод getMap() возвращает ноль

Решение в приведенной выше ссылке работает для меня. Хотя я не нашел документов, говорящих о том, что getMap() будет возвращать полезную ссылку на карту в onActivityCreated, вызов getMap там, кажется, работает.

Другие вопросы по тегам