2

Я работаю над своим первым приложением и получил проблемы с функцией «назад».Ошибка приложения «назад» к фрагменту карты

Когда я открываю приложение, клик в меню на другой фрагмент (2,3 или 4), и я нажимаю кнопку «Назад», приложение отключается. Когда я запустил приложение и нажмите 2 > 3 > 4 (в этом порядке) в меню и нажмите кнопку «Назад», я вернусь к 3 > 2 > crash. Приложение падает, когда я возвращаюсь к mainFragment, который содержит карту google.

Я думаю, что моя проблема имеет какое-то отношение к googlemap в этом фрагменте (фрагмент для перехода назад), потому что, когда я устанавливаю 2, перед строкой ошибки в xml этого представления и запускается снова, номер строки ошибки +2. и когда я прокомментирую этот фрагмент, кнопка возврата работает нормально.

По навигации к новому фрагменту я называю:

fragmentTransaction.replace(R.id.fr_content_container, new NewsFragment()).addToBackStack(null).commit(); 

Ошибка я получаю

04-01 14:26:39.679 19054-19054/aaeu.app E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: aaeu.app, PID: 19054 
                  android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class fragment 
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
                   at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
                   at aaeu.app.presentationlayer.tab_AlertMapsOverview.onCreateView(mapsFragment.java:52) 
                  ..................... 

XML, из mapsFragment является:

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <fragment 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="2" 
      android:name="com.google.android.gms.maps.SupportMapFragment" 
      android:id="@+id/mapwhere" /> 
    </RelativeLayout> 

код из фрагмент карты:

private SupportMapFragment mMapFragment; 
    private AlertManager mAlertManager; 
    private GoogleMap mGoogleMap; 
    HashMap<Marker, Alert> mMarkerMap; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mAlertManager = new AlertManager(getContext()); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.overview_maps_alert_tab, container, false); 
     ButterKnife.bind(this, view); 

     loadMap(); 

     return view; 
    } 

    private void loadMap() { 
     mMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapwhere); 
     if (mMapFragment == null) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      mMapFragment = SupportMapFragment.newInstance(); 
      fragmentTransaction.replace(R.id.mapwhere, mMapFragment).commit(); 
     } 

     if (mMapFragment != null) { 
      mMapFragment.getMapAsync(new OnMapReadyCallback() { 
       @Override 
       public void onMapReady(GoogleMap googleMap) { 
        if (googleMap != null) { 
         googleMap.getUiSettings().setAllGesturesEnabled(true); 

         LatLng marker_latlng = new LatLng(55.042684, 14.125549); 

         CameraPosition cameraPosition = new CameraPosition.Builder().target(marker_latlng).zoom(3.0f).build(); 
         CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition); 
         googleMap.moveCamera(cameraUpdate); 

         setGoogleMap(googleMap); 
        } 
       } 
      }); 
     } 
    } 

    private void setGoogleMap(GoogleMap googleMap) { 
     this.mGoogleMap = googleMap; 
    } 


    // This method is called by the asynctask who downloads the alerts 
    @Override 
    public void UpdateAlerts(List<Alert> alerts) { 

     mMarkerMap = new HashMap<Marker, Alert>(); 
     try { 
     for (Alert alert : alerts) { 
      MarkerOptions marker = new MarkerOptions(); 
      marker.position(alert.Location.get(0)); 
      marker.title(alert.GetFullName()); 

      Marker m = mGoogleMap.addMarker(marker); 
      mMarkerMap.put(m, alert); 
     } 


      mGoogleMap.setOnMarkerClickListener(
        new GoogleMap.OnMarkerClickListener() { 
         @Override 
         public boolean onMarkerClick(Marker marker) { 
          startDetailView(marker); 
          return false; 
         } 
        } 
      ); 
     } 
     catch (NullPointerException e) 
     { 
      Log.i("tab_AlertMapsOverview","No missings to create markers for or set clicklisteners on. Are there missings in the configured Areas?"); 
     } 
    } 

Вблизи этой проблемы у меня тоже есть вопрос. Когда у меня есть 3 фрагмента, 1, 2 и 3. Когда я (например) начинаю в действии 1 и переходим к 2> 3> 2> 3, мне нужно нажать 4 раза назад, чтобы вернуться в 1. Можно ли использовать своего рода «дерево» для обратной навигации. так что я всегда поднимаюсь на 1 уровень? Возможно, это очищает то, что я имею в виду.

this Я думаю, что и нынешняя ситуация далека от оптимальной, потому что фрагменты все еще активны в ОЗУ? или я ошибаюсь?

ответ

2

У меня тоже была такая же проблема. Потеряв много времени на поиск решения, я наконец сделал это, я удалил фрагмент тега из xml. Поместите FrameLayout туда и всякий раз, когда я хочу добавить этот фрагмент, я бы добавил его с транзакцией фрагмента. Это сработало для меня.

Причина в том, что всякий раз, когда вызывается onCreateView() для этого фрагмента, файл xml будет завышен, что раздувает фрагмент. Это приведет к нескольким фрагментам с одним и тем же идентификатором, который вызывает это исключение.

+0

Я не понимаю этого 100%. Какой ярлык вы удалили ?, весь тэг «Frament»? или только часть 'android: name =" com.google.android.gms.maps.SupportMapFragment "? И что вы имеете в виду под «поставить там»? Я понимаю, что 'onCreate' раздувает XML, но почему мой xml снова раздувает фрагмент? (или раздувает другой фрагмент?) – RoDo

+1

тэг вы должны удалить и заменить его с помощью и использовать транзакцию обычного фрагмента для добавления фрагмента карты так же, как и для NewsFragment. На самом деле, если вы снова вернетесь к фрагменту, его снова вызовет onCreateView(), который снова раздует фрагмент, и оба фрагмента будут иметь одинаковые идентификаторы. –

+0

Спасибо, что кнопка back отлично работает! – RoDo