Android – android.view.InflateException: двоичная строка XML-файла # 8: ошибка раздувания fragmentа classа

Я разрабатываю приложение, используя NavigationDrawer т.е. DrawerLayout и перемещаясь по разным Fragments . Когда я вызываю Map_Fragment_Page приложение вылетает, но не в первый раз. Впервые он отображает Map должным образом, но после этого, когда я перемещаюсь по различным fragmentам и снова возвращаюсь к Map_Fragment_Page он выдает сообщение об ошибке android.view.InflateException: Binary XML file line #8: Error inflating class fragment

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

howtoreach.xml

     

HowToReach.java

  package com.demo.map.howtoreach; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import android.support.v4.app.Fragment; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.Polyline; import com.google.android.gms.maps.model.PolylineOptions; import com.demo.map.R; import android.app.ProgressDialog; import android.content.Context; import android.graphics.Color; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; public class HowToReach extends Fragment { public static final String TAG = "fragment_5"; ProgressDialog dialog; GoogleMap googleMap; Marker marker; LocationManager locationManager; Location location; Criteria criteria; String provider; double latitude, longitude; public HowToReach(){} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View v = inflater.inflate(R.layout.howtoreach, container, false); dialog = ProgressDialog.show(getActivity(),"","Loading",true,false); int secondsDelayed = 4; new Handler().postDelayed(new Runnable() { public void run() { dialog.dismiss(); } }, secondsDelayed * 1000); try { // Loading map if (googleMap == null) { googleMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.howtoreach_map)).getMap(); googleMap.setMyLocationEnabled(true); locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); criteria = new Criteria(); provider = locationManager.getBestProvider(criteria, true); location = locationManager.getLastKnownLocation(provider); latitude = location.getLatitude(); longitude = location.getLongitude(); // create marker marker = googleMap.addMarker(new MarkerOptions().position( new LatLng(latitude, longitude)).title("You are Here")); marker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); marker.showInfoWindow(); CameraPosition cameraPosition = new CameraPosition.Builder().target( new LatLng(latitude, longitude)).zoom(15).build(); googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); Polyline line = googleMap.addPolyline(new PolylineOptions() .add(new LatLng(latitude, longitude), new LatLng(18.520897,73.772396)) .width(2).color(Color.RED).geodesic(true)); marker = googleMap.addMarker(new MarkerOptions().position( new LatLng(18.520897, 73.772396)).title("DSK Ranwara Road")); marker.setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); // check if map is created successfully or not if (googleMap == null) { Toast.makeText(getActivity(),"Sorry! unable to create maps", Toast.LENGTH_SHORT).show(); } } } catch (Exception e) { e.printStackTrace(); } return v; } } 

 Yes.. I want Map inside a Fragment. 

Вы должны использовать MapView

http://developer.android.com/reference/com/google/android/gms/maps/MapView.html

 public class HowToReach extends Fragment { MapView mapView; GoogleMap map; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment2, container, false); // Gets the MapView from the XML layout and creates it try { MapsInitializer.initialize(getActivity()); } catch (GooglePlayServicesNotAvailableException e) { Log.e("Address Map", "Could not initialize google play", e); } switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()) ) { case ConnectionResult.SUCCESS: Toast.makeText(getActivity(), "SUCCESS", Toast.LENGTH_SHORT).show(); mapView = (MapView) v.findViewById(R.id.map); mapView.onCreate(savedInstanceState); // Gets to GoogleMap from the MapView and does initialization stuff if(mapView!=null) { map = mapView.getMap(); map.getUiSettings().setMyLocationButtonEnabled(false); map.setMyLocationEnabled(true); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(43.1, -87.9), 10); map.animateCamera(cameraUpdate); } break; case ConnectionResult.SERVICE_MISSING: Toast.makeText(getActivity(), "SERVICE MISSING", Toast.LENGTH_SHORT).show(); break; case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: Toast.makeText(getActivity(), "UPDATE REQUIRED", Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(getActivity(), GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()), Toast.LENGTH_SHORT).show(); } // Updates the location and zoom of the MapView return v; } @Override public void onResume() { mapView.onResume(); super.onResume(); } @Override public void onDestroy() { super.onDestroy(); mapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mapView.onLowMemory(); } } 

fragment2.xml

     

Обновить:

 https://developers.google.com/android/reference/com/google/android/gms/maps/MapView#public-constructors 

getMap() устарел. getMapAsync(OnMapReadyCallback) используйте getMapAsync(OnMapReadyCallback) . Метод обратного вызова предоставляет вам экземпляр GoogleMap, который должен быть не нулевым и готовым к использованию.

Поэтому, если он сработает после открытия fragmentа второй раз. Все, что вам нужно, это в OnDestroy

 @Override public void onDestroy() { super.onDestroy(); getFragmentManager().beginTransaction().remove(mapfragmentnamehere).commit(); } 

Внесите необходимые изменения, если вы используете fragment поддержки

Мой опыт сделан с fragmentами, добавленными xml-тегом

 .... 

Эти fragmentы обычно вложены и не уничтожаются при уничтожении родительского fragmentа. Как только вы попытаетесь раздуть их снова, вы получите исключение, которое в основном жалуется на то, что этот fragment уже завышен. Поэтому я уничтожаю свои вложенные fragmentы вручную после уничтожения родительского fragmentа. Просто используйте следующий отрезанный и отрегулируйте его к вашим потребностям. Этот код находится в родительском fragmentе, который имеет вложенный fragment как xml-tag.

 @Override public void onDestroy() { super.onDestroy(); final FragmentManager fragManager = this.getFragmentManager(); final Fragment fragment = fragManager.findFragmentById(/*id of fragment*/); if(fragment!=null){ fragManager.beginTransaction().remove(fragment).commit(); } } 

С динамически создаваемыми fragmentами проблем вообще нет. Динамически означает: у вас нет используемого fragmentа-xml-тега

Надеюсь это поможет! Хорошее программирование!

Я положил это в свой fragment

 @Override public void onPause() { super.onPause(); getChildFragmentManager().beginTransaction() .remove(mMapFragment) .commit(); } 

Он работает без замены MapView.

Изменить это

 googleMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.howtoreach_map)).getMap(); 

в

 googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.howtoreach_map)).getMap(); 

В вашем classе


  View mTrackView = inflater.inflate(R.layout.mylayout, container, false); SupportMapFragment mSupportMapFragment = SupportMapFragment.newInstance(); FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.mapwhere, mSupportMapFragment); fragmentTransaction.commit(); if(mSupportMapFragment!=null){ googleMap = mSupportMapFragment.getMap(); if(googleMap!=null){ googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.getUiSettings().setMyLocationButtonEnabled(false); googleMap.setMyLocationEnabled(false); if (mgpr_tracker.canGetLocation()) CURREN_POSITION = new LatLng(mgpr_tracker.getLatitude(), mgpr_tracker.getLongitude()); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom( CURREN_POSITION, ZOOM_LEVEL); googleMap.animateCamera(cameraUpdate); } } 

mylayout.xml


     

Как вы говорите в первый раз, когда ваш код работает, поэтому я думаю, что когда вы снова назовете свою карту, ваш объект googlemap не является null и вы не обработали его правильно, попробуйте выполнить так, как это в вашем коде

 if (googleMap == null) { // Your code } else if(googleMap != null) { marker = googleMap.addMarker(new MarkerOptions().position(new LatLng(18.520897, 73.772396)).title("DSK Ranwara Road")); } 

Проверьте, есть ли у вас точное разрешение манифеста. Я не включил нижеприведенное разрешение в манифест, и он дал эту ошибку.

  

В файл манифеста укажите некоторые из следующих разрешений

        

Я поместил это в свой fragment, когда у меня есть viewpager:

 @Override public void onPause() { Fragment fragment = (getChildFragmentManager().findFragmentById(R.id.fragment_map_map)); FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.remove(fragment); ft.commit(); super.onPause(); } 

Чтобы Google API v2 работал (я также использую SupportMapFragment), вы должны включить эти разрешения

       

Надеюсь, это поможет вам, ребята.

PS Я использовал эти разрешения для добавления простой карты в свое приложение. Существуют и другие разрешения, которые предлагает эта ссылка .

Я получил то же сообщение об ошибке:

Причиной для меня было просто: воссоздать представление

 public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ super.onCreateView(inflater,container,savedInstanceState); self_view=inflater.inflate(R.layout.fragment_player,container,false); return self_view; } 

onCreateView может вызываться более одного раза.

Когда это произойдет, приведенный выше код создает новое представление для fragmentа, а старый – все еще.

Ошибка появляется с некоторым адаптером и не с другим; в моем случае FragmentStatePagerAdapter был счастлив, а FragmentPagerAdapter был убийственным, потому что бывший уничтожил его fragmentы, а последний использовал их повторно.

Как я исправил свою проблему после многого поиска, Поместите эти строки внутри fragmentа onPause Method.

 @Override public void onPause() { super.onPause(); final FragmentManager fragManager = this.getChildFragmentManager(); final Fragment fragment = fragManager.findFragmentById(R.id.map); if(fragment!=null){ fragManager.beginTransaction().remove(fragment).commit(); googleMap=null; } } 

Обязательно null googlemap. Нет необходимости использовать MapView, вы можете сделать это, не используя MapView

  • Как создать наложение справки, как вы видите в нескольких приложениях для Android и ICS?
  • Android и Facebook разделяют намерения
  • Активность запуска Android от службы
  • ViewPager setCurrentItem (pageId, true) НЕ плавает
  • NetworkOnMainThreadException
  • Взятие «скриншотов» определенного макета в Android
  • Ошибка поддержки библиотеки Android после обновления до 23.3.0
  • Приемник смены режима звонка Широковещательный приемник?
  • Как передавать данные между fragmentами
  • Как сохранить данные в приложении Android
  • Потоковое аудио с URL-адреса в Android с помощью MediaPlayer?
  • Давайте будем гением компьютера.