1

Я получаю следующее исключение, когда я выхожу из приложения. В моем приложении есть один ящик для навигации. Каждый элемент ящика является фрагментом. У меня есть карта в одном фрагменте, а другие фрагменты содержат простые макеты. Я обработал задний пресс в mainactivity и закончил там деятельность. Но мое приложение разбилось, когда я возвращаюсь из фрагмента карты (в фрагменте карты я просто получаю текущее местоположение). Вот трассировки стека я получаю:Получение исключения android.app.FragmentManagerImpl.execPendingActions при выходе из приложения

04-14 10:20:40.822: E/AndroidRuntime(17446): FATAL EXCEPTION: main 
04-14 10:20:40.822: E/AndroidRuntime(17446): java.lang.NullPointerException 
04-14 10:20:40.822: E/AndroidRuntime(17446): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1372) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at android.os.Handler.handleCallback(Handler.java:615) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at android.os.Looper.loop(Looper.java:137) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at android.app.ActivityThread.main(ActivityThread.java:4745) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at java.lang.reflect.Method.invokeNative(Native Method) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at java.lang.reflect.Method.invoke(Method.java:511) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
04-14 10:20:40.822: E/AndroidRuntime(17446): at dalvik.system.NativeStart.main(Native Method) 

это мой фрагмент

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     rootView = inflater.inflate(R.layout.fragment_photos, container, false); 
     googleMap = ((MapFragment) getFragmentManager().findFragmentById(
       R.id.currentmap)).getMap(); 
     geocoder = new Geocoder(getActivity(), Locale.getDefault()); 
     // Enabling MyLocation Layer of Google Map 
     googleMap.setMyLocationEnabled(true); 

     // Getting LocationManager object from System Service LOCATION_SERVICE 
     LocationManager locationManager = (LocationManager) getActivity() 
       .getSystemService(Context.LOCATION_SERVICE); 

     // Creating a criteria object to retrieve provider 
     Criteria criteria = new Criteria(); 

     // Getting the name of the best provider 
     String provider = locationManager.getBestProvider(criteria, true); 

     // Getting Current Location 
     Location location = locationManager.getLastKnownLocation(provider); 

     if (location != null) { 
      onLocationChanged(location); 
     } 

     locationManager.requestLocationUpdates(provider, 20000, 0, this); 
     return rootView; 
    } 

    private String getCompleteAddressString(double LATITUDE, double LONGITUDE) { 
     String strAdd = ""; 

     try { 
      List<Address> addresses = geocoder.getFromLocation(LATITUDE, 
        LONGITUDE, 1); 
      if (addresses != null) { 
       Address returnedAddress = addresses.get(0); 
       StringBuilder strReturnedAddress = new StringBuilder(""); 

       for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++) { 
        strReturnedAddress 
          .append(returnedAddress.getAddressLine(i)).append(
            "\n"); 
       } 
       strAdd = strReturnedAddress.toString(); 
       tvLocation.setText(strAdd); 
       Log.w("My Current loction address", 
         "" + strReturnedAddress.toString()); 
      } else { 
       Log.w("My Current loction address", "No Address returned!"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.w("My Current loction address", "Canont get Address!"); 
     } 
     return strAdd; 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     tvLocation = (TextView) rootView.findViewById(R.id.tv_location); 

     // Getting latitude of the current location 
     double latitude = location.getLatitude(); 

     // Getting longitude of the current location 
     double longitude = location.getLongitude(); 

     // Creating a LatLng object for the current location 
     LatLng latLng = new LatLng(latitude, longitude); 

     // Showing the current location in Google Map 
     googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 

     // Zoom in the Google Map 
     googleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); 

     // Setting latitude and longitude in the TextView tv_location 
     getCompleteAddressString(latitude, longitude); 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 
    } 

/* 
    @Override 
    public void onDestroyView() 
    { 
     try{ 
      MapFragment fragment = ((MapFragment) getFragmentManager().findFragmentById(R.id.currentmap)); 
      FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); 
      ft.remove(fragment); 
      ft.commit(); 
     }catch(Exception e){ 
     } 
     super.onDestroyView(); 
    }*/ 



    @Override 

    public void onDestroyView() { 

     super.onDestroyView(); 
     Log.v("in on destroy", "destroy"); 

     Fragment fragment = (getFragmentManager() 
       .findFragmentById(R.id.currentmap)); 
     if (fragment != null) { 
      getActivity().getFragmentManager().beginTransaction() 
        .remove(fragment).commit(); 
      Log.v("in on destroy", "destroy"); 
     } 
    } 

    @Override 
    public void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     googleMap = ((MapFragment) getFragmentManager().findFragmentById(
       R.id.currentmap)).getMap(); 
    } 
} 

Что такое решение этого?

+0

Вам нужно уничтожить фрагмент для отображения и в 'onResume()' необходимо инициализировать карту Google снова , – Piyush

ответ

0

Вам нужно уничтожить фрагмент для карты и onResume() вам необходимо инициализировать карту Google снова

public void onDestroyView() 
    { 
    super.onDestroyView(); 
    Fragment fragment = getFragmentManager().findFragmentById(R.id.map); 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.remove(fragment); 
    ft.commit(); 
    } 
+0

нет метода такой метод onDestroyView() для фрагментов. Вы хотите, чтобы я включил это в действие? –

+0

Его метод переопределения для фрагмента. Просто проверьте правильно. – Piyush

+0

ОК да да и в резюме мне нужно снова инициализировать? но я усугубляюсь increateview. Я должен держать oncreateview так, как есть? –