Я работаю над своим первым приложением и получил проблемы с функцией «назад».Ошибка приложения «назад» к фрагменту карты
Когда я открываю приложение, клик в меню на другой фрагмент (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 уровень? Возможно, это очищает то, что я имею в виду.
Я думаю, что и нынешняя ситуация далека от оптимальной, потому что фрагменты все еще активны в ОЗУ? или я ошибаюсь?
Я не понимаю этого 100%. Какой ярлык вы удалили ?, весь тэг «Frament»? или только часть 'android: name =" com.google.android.gms.maps.SupportMapFragment "? И что вы имеете в виду под «поставить там»? Я понимаю, что 'onCreate' раздувает XML, но почему мой xml снова раздувает фрагмент? (или раздувает другой фрагмент?) – RoDo
тэг вы должны удалить и заменить его с помощью и использовать транзакцию обычного фрагмента для добавления фрагмента карты так же, как и для NewsFragment. На самом деле, если вы снова вернетесь к фрагменту, его снова вызовет onCreateView(), который снова раздует фрагмент, и оба фрагмента будут иметь одинаковые идентификаторы. –
Спасибо, что кнопка back отлично работает! – RoDo