简体   繁体   中英

How to save and restore marker array

I need to save triggered locations to show them when I open the app again.

I used int array to save numbers of triggered locations in onMarkerClick method. And using this array create required markers in createMarkers method. I tried to save and restore this array but it doesn't work.

parts of Activity.class

public class MapsActivity extends FragmentActivity
        implements
        OnRequestPermissionsResultCallback,
        OnMapReadyCallback,
        OnMarkerClickListener {

    
    private LatLng[] latLngArray;
    private String[] titleArray;
    private Marker[] markerArray;
    private int[] resIdArray;
    private int ARRAY_SIZE = 7;
    private int COUNTER = 0;
    private static final float DISTANCE = 50;
    private boolean START_POINT_CHECKED = false;

    public final String inArrayName= "inArray";

    //public int outArray[] = new int[ARRAY_SIZE];
    public int inArray[];

    private Location mCurrentLocation;
    private GoogleMap mMap;


    private MediaPlayer mediaPlayer;

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
            outState.putIntArray(outArrayName,inArray);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle inState) {
        inArray = inState.getIntArray(outArrayName);
        super.onRestoreInstanceState(inState);
    }

    @Override
    protected void onCreate(Bundle inState) {
        inArray = new int[ARRAY_SIZE];
        super.onCreate(inState);
        setContentView(R.layout.activity_maps);
        if(inState == null){
            for (int i=0; i<ARRAY_SIZE;i++){
                inArray[i]=0;
            }
        }

   private void createMarkersList(){
        markerArray = new Marker[ARRAY_SIZE];
        if(inArray[0] == 777) {

            markerArray[0] = mMap.addMarker(new MarkerOptions()
                    .position(latLngArray[0])
                    .anchor(0.5f, 0.5f)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker1))
                    .title(titleArray[0])
                    .snippet("0")
                    .visible(true)
            );
            markerArray[0].setTag(666);
            inArray[0] = 777;
            START_POINT_CHECKED = true;
        } else {
            markerArray[0] = mMap.addMarker(new MarkerOptions()
                    .position(latLngArray[0])
                    .anchor(0.5f, 0.5f)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker2))
                    .title(titleArray[0])
                    .snippet("0")
                    .visible(true)
            );
            markerArray[0].setTag(0);
        }


        if (START_POINT_CHECKED) {
            for (int i = 1; i < ARRAY_SIZE; i++) {
                if (inArray[i] == 777) {
                    markerArray[i] = mMap.addMarker(new MarkerOptions()
                            .position(latLngArray[i])
                            .anchor(0.5f, 0.5f)
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker1))
                            .title(titleArray[i])
                            .snippet(Integer.toString(i))
                            .visible(true)
                    );
                    markerArray[i].setTag(666);
                    inArray[i]=777;
                } else {
                    markerArray[i] = mMap.addMarker(new MarkerOptions()
                            .position(latLngArray[i])
                            .anchor(0.5f, 0.5f)
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker2))
                            .title(titleArray[i])
                            .snippet(Integer.toString(i))
                            .visible(true)
                    );
                    markerArray[i].setTag(i);
                }
            }
        } else {
            for (int i = 1; i < ARRAY_SIZE; i++) {
                markerArray[i] = mMap.addMarker(new MarkerOptions()
                        .position(latLngArray[i])
                        .anchor(0.5f, 0.5f)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.marker2))
                        .title(titleArray[i])
                        .snippet(Integer.toString(i))
                        .visible(false)
                );
                markerArray[i].setTag(i);
            }
        }

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setOnMarkerClickListener(this);


        EnableUserLocation();

        MapStyling();

        createLatLngsList();
        createTitlesList();
        createMarkersList();
        createResIdArray();

    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        int id = (int) marker.getTag();
        Log.d(TAG, "Marker" + id + "Clicked");
        if (getDistance(marker.getPosition(), new LatLng(mCurrentLocation.getLatitude(),mCurrentLocation.getLongitude())) <= DISTANCE){
            if (  id == 666){
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                    return true;
                } else{
                    mediaPlayer.start();
                }
            } else {
                if(START_POINT_CHECKED) {
                    marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.marker1));

                    if (mediaPlayer!= null){
                        mediaPlayer.reset();
                    }
                    mediaPlayer = MediaPlayer.create(this, resIdArray[id]);
                    mediaPlayer.start();
                    inArray[id] = 777;
                    marker.setTag(666);
                    COUNTER++;
                    if (COUNTER == 7){
                        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            @Override
                            public void onCompletion(MediaPlayer mediaPlayer) {
                                showPicture();
                            }
                        });

                    }
                    return true;
                } else{
                    if(id == 0) {
                        marker.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.marker1));
                        if (mediaPlayer!= null){
                            mediaPlayer.reset();
                        }
                        mediaPlayer = MediaPlayer.create(this, resIdArray[id]);
                        mediaPlayer.start();
                        inArray[id] = 777;
                        marker.setTag(666);
                        COUNTER++;
                        START_POINT_CHECKED = true;
                        showMarkers();
                        return true;
                    }else {
                        return true;
                    }
                }
            }

        }
        return false;
    }


Well if your tags are always the same for the same markers you could just put an array into shared preferences and restore those positions in onMapReady

You would add the tag values in the onMarkerClick method

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM