Home > front end >  Listening to preference changes and applying them on another activity in android studio
Listening to preference changes and applying them on another activity in android studio

Time:04-17

I have a google maps fragment in my MainActivity and a SettingsActivity that has a ListPreference option to select styles for the map. What I want to do is to listen to the changes in that preference, and change the map on the MainActivity accordingly. I can only change it on onMapReady which is a one time thing it is not a listener. How can I do this? I tried to do it in the SettingsActivity but I can't access mapStyle.

MainActivity:

    private MapFragment mapFragment;
    String mapStyle;
    private GoogleMap map;
    private GoogleApiClient googleApiClient;
    SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        mapStyle = prefs.getString("list_preference_1", "<unset>");

        mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        if (googleApiClient == null) {
                    googleApiClient = new GoogleApiClient.Builder(this)
                            .addConnectionCallbacks(this)
                            .addOnConnectionFailedListener(this)
                            .addApi(LocationServices.API)
                            .build();
                }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        map = googleMap;
        map.setOnMapClickListener(this);
        map.setOnMarkerClickListener(this);
        map.getUiSettings().setZoomControlsEnabled(true);

        try {
            // Customise the styling of the base map using a JSON object defined
            // in a raw resource file.
            int res;
            if (mapStyle.equals("Silver")){
                res = R.raw.silver_style;
            } else if (mapStyle.equals("Retro")) {
                res = R.raw.retro_style;
            } else if (mapStyle.equals("Dark")) {
                res = R.raw.dark_style;
            } else if (mapStyle.equals("Night")) {
                res = R.raw.night_style;
            } else if (mapStyle.equals("Aubergine")) {
                res = R.raw.aubergine_style;
            } else {
                res = R.raw.standard;
            }
            boolean success = googleMap.setMapStyle(
                    MapStyleOptions.loadRawResourceStyle(
                            this, res));

            if (!success) {
                Log.e(TAG, "Style parsing failed.");
            }
        } catch (Resources.NotFoundException e) {
            Log.e(TAG, "Can't find style. Error: ", e);
        }
    }

SettingsActivity:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings_activity);
        if (savedInstanceState == null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.settings, new SettingsFragment())
                    .commit();
        }
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
        }
    }

CodePudding user response:

Maybe not best solution, but i think you could update your map style on activity resume. After opening settings activity and selecting style you could return to map activity. OnResume function would be called and you would check which style has been selected and update map based on this information.

Maybe something like so would be sufficient:

@Override
protected void onResume() {
    super.onResume();
    SetMapStyle(map);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    map = googleMap;
    map.setOnMapClickListener(this);
    map.setOnMarkerClickListener(this);
    map.getUiSettings().setZoomControlsEnabled(true);
    SetMapStyle(googleMap);
}

private void SetMapStyle(GoogleMap googleMap){

    if(googleMap == null)
        return;

    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    mapStyle = prefs.getString("list_preference_1", "<unset>");

    try {
        
        int res;
        if (mapStyle.equals("Silver")){
            res = R.raw.silver_style;
        } else if (mapStyle.equals("Retro")) {
            res = R.raw.retro_style;
        } else if (mapStyle.equals("Dark")) {
            res = R.raw.dark_style;
        } else if (mapStyle.equals("Night")) {
            res = R.raw.night_style;
        } else if (mapStyle.equals("Aubergine")) {
            res = R.raw.aubergine_style;
        } else {
            res = R.raw.standard;
        }
        boolean success = googleMap.setMapStyle(
                MapStyleOptions.loadRawResourceStyle(
                        this, res));

        if (!success) {
            Log.e(TAG, "Style parsing failed.");
        }
    } catch (Resources.NotFoundException e) {
        Log.e(TAG, "Can't find style. Error: ", e);
    }

}
  • Related