Нулевой указатель Google Maps [закрыт]

Я получаю нулевой указатель каждый раз, когда пытаюсь создать экземпляр карты.

Я нашел много статей об этом, но это не сработало. Карта должна существовать в другом фрагменте.

Это мой код:

public class ContactFragment extends Fragment {

private Contact contact = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    contact = Shared.dbRepo.contactsRepository.getFirst();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_price, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    GoogleMap map = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    map.setMyLocationEnabled(true);

    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.title(contact.getTitle());
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
    markerOptions.position(getLocation(contact.getAddress()));
    map.addMarker(markerOptions);

}

@Override
public void onResume() {
    super.onResume();
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    MainActivity mainActivity = (MainActivity) activity;
    mainActivity.showActionBar();
}

private LatLng getLocation(String strAddress) {
    Geocoder coder = new Geocoder(getActivity().getApplicationContext());
    List<Address> address;

    try {
        address = coder.getFromLocationName(strAddress, 5);

        if (address == null) {
            Address location = address.get(0);

            return new LatLng(location.getLatitude(), location.getLongitude());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
}

XML:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:name="com.google.android.gms.maps.SupportMapFragment"/>

<TableLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="*"
    android:layout_margin="5dp">

    <TableRow xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="3dp"
        android:paddingBottom="3dp">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/contact_address" />

        <TextView
            android:id="@+id/tv_contact_address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:textColor="@color/text_gray"
            android:autoLink="map"
            android:text="@string/opening_hours" />

    </TableRow>

    <TableRow xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="3dp"
        android:paddingBottom="3dp">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:autoLink="email"
            android:text="@string/contact_email" />

        <TextView
            android:id="@+id/tv_contact_email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:textColor="@color/text_gray"
            android:text="@string/opening_hours" />

    </TableRow>

    <TableRow xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="3dp"
        android:paddingBottom="3dp">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/contact_telephone" />

        <TextView
            android:id="@+id/tv_contact_telephone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:textColor="@color/text_gray"
            android:autoLink="phone"
            android:text="@string/opening_hours" />

    </TableRow>

    <TableRow xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="3dp"
        android:paddingBottom="3dp">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/contact_website" />

        <TextView
            android:id="@+id/tv_contact_website"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:textColor="@color/text_gray"
            android:autoLink="web"
            android:text="@string/opening_hours" />

    </TableRow>
</TableLayout>
</LinearLayout>

Изменить: это исключение, которое я получаю:

05-20 16:32:18.295    6663-6663/be.appmax.twentebad.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: be.appmax.twentebad.app, PID: 6663
    java.lang.NullPointerException
            at be.appmax.twentebad.app.fragments.ContactFragment.onViewCreated(ContactFragment.java:48)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:952)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
            at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5144)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
            at dalvik.system.NativeStart.main(Native Method)

Это строка 48:

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

person kevingoos    schedule 20.05.2014    source источник
comment
Попробуйте мой ответ @Ghost...   -  person Lal    schedule 20.05.2014
comment
что за строка № 50???   -  person Lal    schedule 20.05.2014
comment
Добавил строку 50 в пост   -  person kevingoos    schedule 20.05.2014
comment
Доступны ли сервисы GooglePlay?   -  person Blackbelt    schedule 20.05.2014
comment
не могли бы вы попробовать после копирования всего содержимого в onViewCreated() в onCreateView()..пожалуйста..   -  person Lal    schedule 20.05.2014
comment
Попробуй и скажи мне, что на выходе...   -  person Lal    schedule 20.05.2014
comment
Выход все тот же   -  person kevingoos    schedule 20.05.2014


Ответы (3)


если вы используете

mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));

использовать

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/map"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              class="com.google.android.gms.maps.SupportMapFragment"/>

вы используете SupportMapFragment в классе Java, и вы использовали MapFragment в своем XML-файле. Вот почему NullPointerException повышается...

ИЗМЕНИТЬ

SupportMapFragment mapFragment = ((SupportMapFragment) getActivity().getSupportFragmentManager()
            .findFragmentById(R.id.map)).getMap();
person Lal    schedule 20.05.2014
comment
Я исправил это, но добавил исключение, которое теперь получаю. - person kevingoos; 20.05.2014
comment
Я добавил весь код в сообщение, а также отредактировал исключение - person kevingoos; 20.05.2014
comment
@Ghost является ли фрагмент карты в вашем XML единственным элементом в нем? Если это так, я могу опубликовать более подробный ответ, в отличие от приведенного ниже. Однако я не понимаю, почему вы используете getActivity(). - person Android-converter; 20.05.2014
comment
@Android-converter Я добавил полный XML в свой пост. - person kevingoos; 20.05.2014

Попробуйте эту строку:

mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getExtendedMap();

В основном добавление: .getExtendedMap(); в конце строки вашего фрагмента

РЕДАКТИРОВАТЬ: Если ваш xml таков:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:name="com.google.android.gms.maps.SupportMapFragment"/>

Тогда ваш код в onViewCreated должен быть:

mapFragment = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getExtendedMap();

Я только что создал пример приложения для проверки, и оно работает для меня. Когда вы доберетесь до (R.id.map)). не будет выпадающего списка для getExtendedMap();

person Android-converter    schedule 20.05.2014
comment
По памяти при использовании SupportMapFragment вы должны использовать getExtendedMap, а не getMap, это то, что у меня есть в моем приложении, раньше у меня были проблемы с моим, и getExtendedMap исправил это для меня. - person Android-converter; 20.05.2014
comment
Я пробовал getExtendedMap(), но его не существует. - person kevingoos; 20.05.2014
comment
Не удается разрешить getExtendedMap() - person kevingoos; 20.05.2014
comment
вы импортировали com.google.android.gms.maps.SupportMapFragment в свой файл класса? - person Android-converter; 20.05.2014
comment
В верхней части вашего класса вы должны расширять FragmentActivity не только фрагмент - person Android-converter; 20.05.2014
comment
Да, но тогда это Activity, а не фрагмент. Мне нужно, чтобы фрагмент попал в другую FragmentActivity - person kevingoos; 20.05.2014
comment
Я бы следовал этому сообщению и решению: stackoverflow.com/questions/18206615/ в этом случае, поскольку решения, похоже, есть - person Android-converter; 20.05.2014

открытый класс MapFragmentActivity расширяет FragmentActivity {

GoogleMap map;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_map);
    googleMapMark();


}

private void googleMapMark() {
    // TODO Auto-generated method stub
    try {
        map = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.mapview)).getMap();
        Double lng = null, lat = null;

        Bundle b=getIntent().getExtras();

    if(map!=null){

        if(b!=null)
        {
            lat=b.getDouble("lat");
            Log.v("latitude in MapFragmentActivity","Latitude : " + lat);

            lng=b.getDouble("longitude");
            Log.v("longitude in MapFragmentActivity","Latitude : " + lng);
        }else
        {
            lat=23.0300;
            lng=72.5800;
            Log.v("Bundle is Null","Default lat long is set");
        }

        final LatLng mapPin = new LatLng(lat, lng);
        System.out.println("New Latitude:::-" + lat);
        System.out.println("New Longtitude:::-" + lng);

        map.addMarker(new MarkerOptions()
                .position(mapPin)
                .title("Latitude::-" + lat)
                .snippet("Longtitude::-" + lng)
                .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.malls)));
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(mapPin, 15));
        // Zoom in, animating the camera.
        map.animateCamera(CameraUpdateFactory.zoomTo(15), 2000, null);
    }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

person Darsh Patel    schedule 20.05.2014
comment
Я использую фрагмент, как я уже сказал, поэтому я не могу сделать следующее - person kevingoos; 20.05.2014