Ich habe ein Kartenfragment in meiner Hauptaktivität, das ich auf meinem onMapReady addiere, sagen wir 300 Markierungen. Die Marker sind in 5 Kategorien unterteilt, wobei jede Kategorie in einer List-Kategorie gespeichert ist1 (2,3,4,5) = new ArrayList. Ich habe eine Schaltfläche, die die Markierungen nach Kategorie filtert, indem Sie sie entsprechend den Benutzeroptionen in einem Warndialog sichtbar oder nicht anzeigen.Wie werden Markierungen auf einem Kartenfragment beibehalten, wenn sich die Konfiguration ändert?
for (Marker marker : category1) {
marker.setVisible(true);.....
Alles funktioniert genau so, wie es sollte, bis sich die Bildschirmkonfiguration ändert. Eine Lösung, die ich die sichtbaren Markierungen auf Rotation zu halten gefunden war in meinem onCreate
if (savedInstanceState == null) {
mapFragment.setRetainInstance(true);}
Dies funktioniert für das Halten der aktuellen Auswahl aber dann hinzufügen, wenn ich versuche, wieder Änderungen nichts zu filtern. Der Status des Kartenfragments bleibt bei den Markierungen, die ich gefiltert habe, bevor die Konfiguration geändert wurde.
Auf der anderen Seite, wenn ich nicht die mapFragment.setRetainInstance (true); Jedes Mal, wenn sich die Konfiguration ändert, werden ALLE Markierungen auf dem Fragment erneut hinzugefügt, die Filterung funktioniert wieder, aber ich muss jedes Mal neu filtern.
Wie kann ich alle Markierungen einmal hinzufügen und dann nach dem Kategoriefilter ausblenden/einblenden, die sichtbaren zwischen den Bildschirmdrehungen halten und sie wieder filtern, beginnend mit dem letzten Zustand, in dem sie sich befanden? Hier
UPDATE
ist, was ich habe (ich habe nur versucht, den entsprechenden Code hinzufügen)
Boolean mSetCameraPosition;
Boolean initialMarkers;
Boolean checkBox1Checked, checkBox2Checked, checkBox3Checked, checkBox4Checked, checkBox5Checked;
private int mapTypeSelected;
CheckBox cbAllDay, cbBefore12, cbBetween1216, cbBetween1620, ccbAfter20;
AlertDialog dialog;
List<Marker> firstCategoryList = new ArrayList<>();
List<Marker> secondCategoryList = new ArrayList<>();
List<Marker> thirdCategoryList = new ArrayList<>();
List<Marker> fourthCategoryList = new ArrayList<>();
List<Marker> fifthCategoryList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkLocationPermission();
}
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
if (savedInstanceState == null) {
mapTypeSelected = GoogleMap.MAP_TYPE_NORMAL;
mSetCameraPosition = true;
mapFragment.setRetainInstance(true);
initialMarkers = true;
} else {
mapTypeSelected = savedInstanceState.getInt("the_map_type", GoogleMap.MAP_TYPE_NORMAL);
mSetCameraPosition = false;
initialMarkers = false;
checkBox1Checked = savedInstanceState.getBoolean("checkBox1");
checkBox2Checked = savedInstanceState.getBoolean("checkBox2");
checkBox3Checked = savedInstanceState.getBoolean("checkBox3");
checkBox4Checked = savedInstanceState.getBoolean("checkBox4");
checkBox5Checked = savedInstanceState.getBoolean("checkBox5");
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
if (mSetCameraPosition) {
initialLocation(TOULOUSE_LAT, TOULOUSE_LNG, 12);
}
mMap.setMapType(mapTypeSelected);
if (initialMarkers) {
addMarkers2Map();
}
public void addMarkers2Map() {
// Markers location
LatLng marker1 = new LatLng(43.607044, 1.450307);
LatLng marker2= new LatLng(43.571505, 1.417759);
LatLng marker3= new LatLng(43.607469, 1.447162);
LatLng marker4= new LatLng(43.600723, 1.455917);
LatLng marker5= new LatLng(43.604892, 1.476562);
LatLng marker6= new LatLng(43.604496, 1.474924);
LatLng marker7= new LatLng(43.604781, 1.474502);
// Markers All day long
firstCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker1).title("First Place ").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 8.30 - 22.30")));
// Markers Before 12 PM
secondCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker2).title("Second Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 10.30 - 11.30")));
// Markers Between 12-16
thirdCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker3).title("Third Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 15.30 - 16.30")));
thirdCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker4).title("Fourth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 15.00 - 16.00")));
// Markers Between 16-20
fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker5).title("Fifth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 15.30 - 16.30")));
fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker6).title("Sixth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 16.30 - 17.30")));
fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker7).title("Seventh Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 18.30 - 19.30")));
fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker8).title("Eighth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 17.30 - 18.30\nHH:21.30 - 22.30")));
// Markers After 20
fifthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker8).title("Eighth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 17.30 - 18.30\nHH:21.30 - 22.30")));
fifthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker1).title("First Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 8.30 - 22.30")));
public void filterTheMarkers(View view) {
if (dialog == null){
AlertDialog.Builder builder;
builder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
@SuppressLint("InflateParams") View checkBoxView = inflater.inflate(R.layout.markers_filtering, null);
builder.setView(checkBoxView);
cbAllDay = (CheckBox) checkBoxView.findViewById(R.id.checkBox1);
if (checkBox1Checked != null) {
cbAllDay.setChecked(checkBox1Checked);
}
cbBefore12 = (CheckBox) checkBoxView.findViewById(R.id.checkBox2);
if (checkBox2Checked != null) {
cbBefore12.setChecked(checkBox2Checked);
}
cbBetween1216 = (CheckBox) checkBoxView.findViewById(R.id.checkBox3);
if (checkBox3Checked != null) {
cbBetween1216.setChecked(checkBox3Checked);
}
cbBetween1620 = (CheckBox) checkBoxView.findViewById(R.id.checkBox4);
if (checkBox4Checked != null) {
cbBetween1620.setChecked(checkBox4Checked);
}
ccbAfter20 = (CheckBox) checkBoxView.findViewById(R.id.checkBox5);
if (checkBox5Checked != null) {
ccbAfter20.setChecked(checkBox5Checked);
}
dialog = builder.create();
}
dialog.show();
}
public void displaySelectedMarkers(View view) {
dialog.dismiss();
Log.i("TAG", "All Day " + cbAllDay.isChecked() + " Before 12 " + cbBefore12.isChecked() + " Between 12-16 " + cbBetween1216.isChecked() + " Between 16-20" + cbBetween1620.isChecked() + " After 20 " + ccbAfter20.isChecked());
//according these check boxes status execute your code to show/hide markers
if (cbAllDay.isChecked() && cbBefore12.isChecked() && cbBetween1216.isChecked() && cbBetween1620.isChecked() && ccbAfter20.isChecked()) {
// show all markers
for (Marker marker : firstCategoryList) {
marker.setVisible(true);
}
for (Marker marker : secondCategoryList) {
marker.setVisible(true);
}
for (Marker marker : thirdCategoryList) {
marker.setVisible(true);
}
for (Marker marker : fourthCategoryList) {
marker.setVisible(true);
}
for (Marker marker : fifthCategoryList) {
marker.setVisible(true);
}
} else if (cbAllDay.isChecked() && !cbBefore12.isChecked() && !cbBetween1216.isChecked() && !cbBetween1620.isChecked() && !ccbAfter20.isChecked()) {
// show only All Day Markers
for (Marker marker : firstCategoryList) {
marker.setVisible(true);
}
for (Marker marker : secondCategoryList) {
marker.setVisible(false);
}
for (Marker marker : thirdCategoryList) {
marker.setVisible(false);
}
for (Marker marker : fourthCategoryList) {
marker.setVisible(false);
}
for (Marker marker : fifthCategoryList) {
marker.setVisible(false);
}
}
//....and it goes like this for a while until I finish all the possibilities
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("the_map_type", mapTypeSelected);
outState.putBoolean("checkBox1", cbAllDay.isChecked());
outState.putBoolean("checkBox2", cbBefore12.isChecked());
outState.putBoolean("checkBox3", cbBetween1216.isChecked());
outState.putBoolean("checkBox4", cbBetween1620.isChecked());
outState.putBoolean("checkBox5", ccbAfter20.isChecked());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedInstanceState.get("the_map_type");
checkBox1Checked = savedInstanceState.getBoolean("checkBox1");
checkBox2Checked = savedInstanceState.getBoolean("checkBox2");
checkBox3Checked = savedInstanceState.getBoolean("checkBox3");
checkBox4Checked = savedInstanceState.getBoolean("checkBox4");
checkBox5Checked = savedInstanceState.getBoolean("checkBox5");
Ich würde empfehlen, dass Sie 'onSavedInstanceState' Methode verwenden, um den Status Ihrer Anwendung zu speichern, wenn sich die Konfiguration ändert (wie es normal ist) und den Status in' onCreate' wiederherzustellen. Das bedeutet, dass Sie sich daran erinnern müssen, welche Filter ausgewählt wurden, und legen Sie sie erneut fest. Sie müssen sich daran erinnern, welche Marker geöffnet wurden, und sie erneut öffnen. – Ali
Ich habe meine Frage mit einem Teil des Codes aktualisiert, den ich für relevant halte, können Sie mir ein Beispiel geben, wie Sie es tun würden? Danke im Voraus. –