Intereting Posts
Приложение Android Webview не позволит проигрывателю проигрывать весь экран Есть ли способ игнорировать INSTALL_FAILED_VERSION_DOWNGRADE при установке приложения с Android Debug Bridge? Адаптер Android Gallery с MultiTouch? Пользовательская галерея или пользовательский ImageView? Особенности использования Looper.prepare () в Android EventBus: активность не получает событие, когда приложение находится в фоновом режиме Просмотр полной экранной камеры без искажения / растяжения Невозможно модифицировать данные POST от модификации 2 Как скомпилировать и связать код ржавчины с пакетом приложений для Android Настройка политики конфиденциальности Android Android EditText not Multi Line Добавить рингтоны в эмулятор android Установите тайм-аут для запроса androidSingleUpdate Диалоговая тема AppCompat с неправильным заголовком – ошибка? RealmObject AND Parcelable Как исключить определенные сообщения по имени TAG с помощью Android adb logcat?

MapFragment, вызывающий NullPointerException при методе getMapAsync (this)

Я реализовал активность, которая добавляет MapFragment во время выполнения. У MapFragment xml есть статический fragment и я пытаюсь получить добавление во время выполнения. Также я обнаружил, что в Lollipop есть некоторые проблемы с добавлением фрагмента карты во время выполнения. Просьба проверить возникновение проблемы и временное решение

Я также дал свои коды ниже,

fragment_map.xml

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".fragment.MapsFragment"> <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="appCreators.bloodfinder.activity.MapsActivity"/> <include android:id="@+id/layout" layout="@layout/template_custom_spinner"/> </FrameLayout> 

MapsFragment.java

Реализует onMapReadyCallback

 public class MapsFragment extends SupportMapFragment implements OnMapReadyCallback 

В onResume

 @Override public void onResume() { super.onResume(); ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); } 

Это всегда возвращает мне null, и я также пробовал,

 ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync(this); 

Это также возвращает NullPointerException

MapsActivity.java

 getSupportFragmentManager().beginTransaction().add(R.id.fragmentContainer, MapsFragment.newInstance()).commit(); 

Я добавляю это в метод onCreate обратного вызова Activity.

Я не могу понять, почему я все еще получаю NullPointerException !

Несколько раз я получаю Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference

Помощь будет оценена!

UPDATE: все еще не исправлено. Я получаю следующую ошибку. Я заглянул в журналы, но не знаю, почему это происходит.

 Unable to resume activity {MapsActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference 

Solutions Collecting From Web of "MapFragment, вызывающий NullPointerException при методе getMapAsync (this)"

Я, наконец, решил эту проблему для себя, наблюдая данные ответы в SO. Я сравнил свой код и код в ответах. Мне кажется, что в этом API есть некоторая путаница, и реализация Google очень широка. Я получил это исключение:

 Attempt to invoke interface method 'void com.google.maps.api.android.lib6.e.fl.o()' on a null object reference 

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

Это то, что вам нужно проверить:

  1. Удостоверьтесь, что у вас есть оба из них (у меня были только мета-данные api key)

      <meta-data android:name="com.google.android.geo.API_KEY" android:value="@string/google_maps_key" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 
  2. У вас есть фрагмент в xml, подобный этому, при этом атрибут класса правильный, как показано ниже

      <fragment android:id="@+id/google_map_fragment" class="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> 

В моем случае фрагмент карты является дочерним, внутри другого фрагмента.

Этот родительский фрагмент, по-видимому, не должен быть MapFragment или SupportMapFragment. После изменения его из SupportMapFragment to Fragment карта показала отличные результаты.

 public class ParentFragment extends Fragment { 

Я оставил все остальное, как раньше, но вместо того, чтобы получать карту в onCreateView, я получил ее в onViewCreated следующим образом:

 @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.rewards_google_map_area); if (mapFragment != null) { LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); if (locationManager != null && mapFragment.getMap() != null) { googleMap=mapFragment.getMap(); //after this you do whatever you want with the map } } } 

Я ничего не изменил, и я не возился с rootView или parentView. Как вы могли бы видеть в ответе от @ Константина Логинова

Попробуйте и дайте мне знать.

Некоторое время назад я боролся с подобной проблемой. Ключ был в getMap() в подходящий момент, в onViewCreated() Fragment :

 public class LocationFragment extends Fragment { private SupportMapFragment locationMap; private View rootView; protected View getFragmentView() { View view = getView(); if (view == null) { view = rootView; } return view; } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = getFragmentView(); if (rootView != null) { ViewGroup parent = (ViewGroup) rootView.getParent(); if (parent != null) { parent.removeView(rootView); } } try { rootView = inflater.inflate(R.layout.fragment_signup_specify_location, container, false); } catch (InflateException ex) { Log.e(LOG_TAG, "Inflate Exception in onCreateView; Caused by map fragment", ex); } ...... return getFragmentView(); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); locationMap = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.locationMap); if (locationMap != null) { LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); if (locationManager != null && locationMap.getMap() != null) { locationMap.getMap().setMyLocationEnabled(true); } } } } 

И XML для него выглядит как ваш:

 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/locationMap" android:layout_above="@+id/locationLabelTextView" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.maps.SupportMapFragment" /> </FrameLayout> 

Затем в onViewCreated() вы можете уведомить Activity , что ваш фрагмент карты готов к использованию.

Я надеюсь, что это помогает

В моем случае я использую raw MapView статически в xml-фрагменте. Проблема заключалась в том, что мне пришлось переместить переадресацию вызова mMapView.onCreate(...) на onViewCreated(...) потому что в onCreate() mMapView еще не mMapView . Если вы не используете MapView вам следует дважды проверить, в какой момент вы вызываете getMap() . Я должен быть после того, как внутренний MapView завышен.