Моя проблема в том, что после организации проекта с помощью homefragment.xml, HomeFragment.java, HomeViewModel.java, MainActivity.java и MainActivity .xml, я пытался управлять запросами разрешений через MainActivity и выполнял необходимые операции с другими классами. Приложение работает, но когда я перемещаю карту в определенное место, а затем меняю фрагмент с помощью панели навигации, возврат к карте сбрасывает ее значение на позицию по умолчанию, где находится мое активное местоположение.
Чтобы решить эту проблему, я попытался внести соответствующие исправления, используя методы onSaveInstanceState(Bundle outState) и onCreate(). Однако во время отладки я заметил, что раздел кода в onCreate, где saveInstanceState не имеет значения null, никогда не достигается, поэтому моя попытка кажется бесполезной.
Это мой класс homefragment.java, возможно, я нет узнать, как работает связь между Bundle outState и Bundle saveInstanceState:
Код: Выделить всё
package com.seaguard.ui.home;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import com.seaguard.databinding.FragmentHomeBinding;
import org.osmdroid.api.IGeoPoint;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
public class HomeFragment extends Fragment {
private FragmentHomeBinding binding;
private MapView map;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(savedInstanceState == null) {
System.out.println("BBB");
HomeViewModel homeViewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
binding = FragmentHomeBinding.inflate(inflater, container, false);
View root = binding.getRoot();
// Map
map = binding.map;
map.setTileSource(TileSourceFactory.MAPNIK);
map.setBuiltInZoomControls(false);
map.setMultiTouchControls(true);
MapController mapController = (MapController) map.getController();
mapController.setCenter(new GeoPoint(41.8902, 12.4922)); // Rome
mapController.setZoom(16);
homeViewModel.setCallBack(() -> {
//provider.addLocationSource(LocationManager.NETWORK_PROVIDER);
MyLocationNewOverlay location = new MyLocationNewOverlay(new GpsMyLocationProvider(map.getContext()), map);
location.enableMyLocation();
map.getOverlays().add(location);
location.runOnFirstFix(() -> {
requireActivity().runOnUiThread(() -> map.getController().animateTo(location.getMyLocation()));
});
return location;
});
if (homeViewModel.permissionsRequested()) homeViewModel.setLocation();
return root;
}else{
System.out.println("AAAA");
View root = binding.getRoot();
double latitude = savedInstanceState.getDouble("latitude", 41.8902);
double longitude = savedInstanceState.getDouble("longitude", 12.4922);
int zoom_level = savedInstanceState.getInt("zoom_level", 16);
float map_orientation = savedInstanceState.getFloat("map_orientation", 0);
GeoPoint restoredCenter = new GeoPoint(latitude, longitude);
map.getController().setCenter(restoredCenter);
map.getController().setZoom(zoom_level);
map.setMapOrientation(map_orientation);
return root;
}
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
IGeoPoint center = map.getMapCenter();
outState.putDouble("latitude", center.getLatitudeE6() / 1e6);
outState.putDouble("longitude", center.getLongitudeE6() / 1e6);
outState.putInt("zoom_level", map.getZoomLevel());
outState.putFloat("map_orientation", map.getMapOrientation());
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... droid-java
Мобильная версия