Ошибка исключения Android SupportMapFragment

Я пытаюсь использовать новую библиотеку сервисов 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, к которому прикреплены два фрагмента. Я пытаюсь отобразить карту внутри одного из этих фрагментов вкладок.

Изменить

У меня есть карта для отображения, но теперь я не могу сослаться на карту и изменить карту на гибридную. В основном мне нужно ссылаться на карту, не получая ошибку Null.


comment
См. этот stackoverflow.com/ вопросы/13719263/ . Вкратце вам нужно добавить в качестве модуля всю папку google-play-services_lib, а не только google-play-services.jar.   -  person jumper0k    schedule 07.12.2012
comment
@ jumper0k я уже добавил это   -  person Harsha M V    schedule 07.12.2012
comment
теперь в вашем xml вы используете MapView и в вашем коде в setUpMapIfNeeded вы пытаетесь найти фрагмент по id. Вы должны найти представление по id. Для MapView см. образец Raw MapView   -  person jumper0k    schedule 07.12.2012
comment
@ jumper0k, я просто пробовал. когда я использую код в RawMap, я получаю метод findViewById(int) не определен для типа   -  person Harsha M V    schedule 07.12.2012


Ответы (4)


В onCreateView() вы должны вызвать его родителя. Проверьте мое решение на https://stackoverflow.com/a/13734470/835787 поближе. Карта инициализируется в методе onCreateView() MapFragment, если вы его не вызовете, карта будет нулевой.

person Sloy    schedule 07.12.2012
comment
я думаю что-то упускаю. Когда я выбираю вкладку «Карты», я загружаю PlaceMapsFragment. Поэтому я не уверен, к какому родителю я должен обратиться. Уточните, пожалуйста, какую строку вы имеете в виду? - person Harsha M V; 08.12.2012
comment
я обновил свой код в вопросе. Пожалуйста, направьте, если я на правильном пути - person Harsha M V; 08.12.2012
comment
Слой: У меня работает Карта. Но теперь мне нужно сослаться на представление карты и добавить функциональность на карту. Как я могу установить Ceter или изменить тип MAp из SupportMapFragment. Я использовал тот же код, что и ваш, но столкнулся с исключением нулевого указателя. - person Harsha M V; 10.12.2012
comment
В моем коде, когда initMap() выполняется внутри onCreateView(), карта уже инициализирована (потому что я сначала вызвал super.onCreateView()). Затем вы можете делать с картой все, что вам нужно. В своем коде я меняю некоторые настройки, такие как жесты и положение камеры, и добавляю маркер. Проверьте документы для этого класса, чтобы узнать, что вы можете с ним сделать. - person Sloy; 10.12.2012
comment
я думаю, мне не нужно переопределять onCreateView() и выполнять его через onCreate() Тем не менее я получаю ту же ошибку. Любая идея, как я могу инициировать ее в классе, который расширяет SupportMapFragment - person Harsha M V; 10.12.2012

  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;
    }
    
person Scott Kennedy    schedule 07.12.2012
comment
как мне установить представление в том же самом? - person Harsha M V; 08.12.2012
comment
Когда я не упомянул макет или инициализировал MapView, как мне получить ссылку на него - person Harsha M V; 08.12.2012
comment
SupportMapFragment уже устанавливает собственное представление. Вы можете сохранить ссылку на возвращаемое значение super.onCreateView(), если хотите добавить свои собственные представления. Вам не нужна ссылка на MapView. Просто GoogleMap, который вы можете получить, вызвав getMap() для фрагмента. - person Scott Kennedy; 08.12.2012
comment
Большое спасибо. Я упростил макет и удалил все ссылки на карту, и она заработала. Теперь, если я хочу установить карту в другой тип карты, как я могу сослаться на карту? я получаю нулевую ошибку, если я пытаюсь сделать это - person Harsha M V; 10.12.2012

Я не знаю, помогает это или нет, но вы должны установить ваш пакет здесь:

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

<uses-permission android:name="com.example.newmapview.permission.MAPS_RECEIVE" />
person jumper0k    schedule 07.12.2012
comment
Проклятие. это было глупо с моей стороны. Но я все еще получаю исключение нулевого указателя. В основном я пытаюсь понять, как заполнить карту с помощью кода в макете. - person Harsha M V; 07.12.2012
comment
Для заполнения карты в макете попробуйте использовать MapView. - person jumper0k; 07.12.2012
comment
Вы имеете в виду что-то вроде этого ? Мне все еще нужно добавить ключ API здесь? ‹com.google.android.maps.MapView xmlns:android=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 /› - person Harsha M V; 07.12.2012
comment
Нет, это старый API. Это новое: ‹com.google.android.gms.maps.MapView xmlns:android=схемы. android.com/apk/res/android android:id=@+id/map android:layout_width=match_parent android:layout_height=match_parent/› Посмотрите образцы карт в папке google_play_services. - person jumper0k; 07.12.2012
comment
не работает. обновил мой код и сообщение об ошибке. после попытки выяснить, как заставить его работать. все демонстрации используют FragmentActivity, но ни одна из них не использует SupportFragmentActivity. Я использую фрагмент, потому что я заполняю карту внутри TabHost, на которой размещены два фрагмента. - person Harsha M V; 07.12.2012

Я решил эту ошибку, установив флажок "Копировать проекты в рабочую область" при импорте библиотеки сервисов Google Play.
Подробнее здесь: http://developer.android.com/google

person Umberto    schedule 19.04.2013