MapView не возвращается в нормальное состояние после нажатия переключателя

#java #android #android-fragments #android-maps-v2 #android-switch

#java #Android #android-фрагменты #android-карты-v2 #android-переключатель

Вопрос:

Я пытаюсь вернуть свой вид карты к обычному стилю, когда я переключаю переключатель в моем фрагменте в положение ВЫКЛ, но он не работает. Следующее происходит во время процесса, с которым я сталкиваюсь:

  1. Появился фрагмент (containg map) и переключатель
  2. Переключенный переключатель в положение ON
  3. Появилась стилизованная карта
  4. Щелкающий переключатель в положение ВЫКЛ.
  5. Карта не меняется

Я пытался использовать mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); , но карта по-прежнему остается застрявшей на стилизованном виде карты, когда я щелкаю переключателем. Не совсем уверен, что пошло не так. Что нужно сделать, чтобы решить эту проблему?

 public class FragmentMap extends android.support.v4.app.Fragment implements OnMapReadyCallback {

    private SwitchCompat swt;

    public FragmentMap() {
    }

    GoogleMap mGoogleMap;
    MapView mMapView;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_map, container, false);

        mMapView = (MapView) v.findViewById(R.id.map_park);
        mMapView.onCreate(savedInstanceState);
        mMapView.getMapAsync(this);

        swt = (SwitchCompat) v.findViewById(R.id.switch_map_park);
        swt.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    boolean success = mGoogleMap.setMapStyle(new MapStyleOptions(getResources()
                            .getString(R.string.style_json)));

                    if (!success) {
                        Log.e("TabFragmentMap", "Style parsing failed.");
                    }
                }else{
                    // What goes here?
                    mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                }
            }
        });

        return v;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;
        mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
        mGoogleMap.setBuildingsEnabled(true);
        mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    }

    @Override
    public void onResume() {
        super.onResume();
        mMapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mMapView.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mMapView.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mMapView.onSaveInstanceState(outState);
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mMapView.onLowMemory();
    }
}
  

Ответ №1:

В вашем else коде вы используете setMapType while вы должны использовать setMapStyle с null параметром, чтобы очистить ранее установленный стиль, как упоминалось здесь .

Установите значение null, чтобы очистить все предыдущие пользовательские стили.

Итак, ваш код должен выглядеть следующим образом:

         @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked){
                boolean success = mGoogleMap.setMapStyle(new MapStyleOptions(getResources()
                        .getString(R.string.style_json)));

                if (!success) {
                    Log.e("TabFragmentMap", "Style parsing failed.");
                }
            }else{
                boolean success = mGoogleMap.setMapStyle(null);

                if (!success) {
                    Log.e("TabFragmentMap", "Removing style failed.");
                }
            }
        }
  

Вы также должны Switch вернуть его в предыдущее проверенное состояние в обоих ваших if (!success) условиях и показать Toast пользователям, чтобы они могли понять, что происходит.

Комментарии:

1. К сожалению, я никогда раньше не работал с носимыми устройствами.

Ответ №2:

Остальное в этой части:

             if(isChecked){
                boolean success = mGoogleMap.setMapStyle(new MapStyleOptions(getResources()
                        .getString(R.string.style_json)));

                if (!success) {
                    Log.e("TabFragmentMap", "Style parsing failed.");
                }
            }else{
                // What goes here?
                // mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            }
  

Вам нужно раскомментировать его

             else {
                // What goes here?
                mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            }
  

Комментарии:

1. Это было раскомментировано в первую очередь, но все РАВНО не работает.

2. Ну, тогда посмотрите на другое: логический успех = mGoogleMap.setMapStyle(new MapStyleOptions(getResources() .getString(R.string.style_json))); для активированного, противоположное этому должно быть нет в инструкции else