Правильное сохранение состояния фрагмента в Android JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Правильное сохранение состояния фрагмента в Android Java

Сообщение Anonymous »

Я реализую приложение Android на Java с помощью Android Studio. Мы следуем архитектуре MVVM с помощью Jetpack Compose, и у нас есть панель навигации с различными фрагментами, включая домашний фрагмент и другие. В домашнем фрагменте у меня есть карта, реализованная с помощью OsmDroid.
Моя проблема в том, что после организации проекта с помощью 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());

}

}
Обратите внимание, что я использовал эти println для отладки, и похоже, что AAA никогда не печатается в logcat, поэтому код никогда не выполняется

Подробнее здесь: https://stackoverflow.com/questions/792 ... droid-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»