Как изменить вид карты на фрагменте?

Я разрабатываю приложение, используя mapbox api. На карте, когда пользователь щелкает элемент карты в меню, открывается фрагмент. Позже пользователь может захотеть изменить стиль просмотра карты, например, спутниковый, темный, изумрудный или просто вид на улицу. Пользователь может выбрать стиль карты на панели действий. Я реализовал свою панель действий в основной деятельности. Когда пользователь на фрагменте карты выбирает стиль карты, и переменная приходит к фрагменту, который обрабатывается в основном действии. Эта переменная является строкой стиля карты. Теперь я хочу изменить стиль просмотра карты без воссоздания фрагмента карты. Что можете посоветовать по этой проблеме?

public class GeoMapFragment extends Fragment implements OnMapReadyCallback {

    public MapView mapView = null;
    private MapboxMap mapboxMap;
    public String mapViewSelectedItem ;

    private static final int PERMISSIONS_LOCATION = 0;

    public GeoMapFragment() {
        // Required empty public constructor
    }

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


    }

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


        mapView = (MapView)view.findViewById(R.id.mapview);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(this);

        // Inflate the layout for this fragment
        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    public void onStop() {
        super.onStop();
        mapView.onStop();
    }

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

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

    /**
     * Dispatch onPause() to fragments.
     */
    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }


    @Override
    public void onMapReady(MapboxMap map) {

        mapboxMap = map;
        mapboxMap.setStyle(Style.DARK);
        mapboxMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(0, 0)));

        // Show user location (purposely not in follow mode)
        if ((ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) ||
                (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_LOCATION);
        } else {
            mapboxMap.setMyLocationEnabled(true);
        }

        // TODO - mv.loadFromGeoJSONURL("https://gist.githubusercontent.com/tmcw/10307131/raw/21c0a20312a2833afeee3b46028c3ed0e9756d4c/map.geojson");
        mapboxMap.addMarker(new MarkerOptions().title("Edinburgh").snippet("Scotland").position(new LatLng(55.94629, -3.20777)));
        mapboxMap.addMarker(new MarkerOptions().title("Stockholm").snippet("Sweden").position(new LatLng(59.32995, 18.06461)));
        mapboxMap.addMarker(new MarkerOptions().title("Prague").snippet("Czech Republic").position(new LatLng(50.08734, 14.42112)));
        mapboxMap.addMarker(new MarkerOptions().title("Athens").snippet("Greece").position(new LatLng(37.97885, 23.71399)));
        mapboxMap.addMarker(new MarkerOptions().title("Tokyo").snippet("Japan").position(new LatLng(35.70247, 139.71588)));
        mapboxMap.addMarker(new MarkerOptions().title("Ayacucho").snippet("Peru").position(new LatLng(-13.16658, -74.21608)));
        mapboxMap.addMarker(new MarkerOptions().title("Nairobi").snippet("Kenya").position(new LatLng(-1.26676, 36.83372)));
        mapboxMap.addMarker(new MarkerOptions().title("Canberra").snippet("Australia").position(new LatLng(-35.30952, 149.12430)));

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case PERMISSIONS_LOCATION: {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mapboxMap.setMyLocationEnabled(true);
                }
            }
        }
    }

person Trinity    schedule 25.04.2016    source источник


Ответы (1)


Фрагмент вашей карты должен иметь вызов getMapAsync(), стиль которого вы можете изменить. Вот грубый пример того, как вы можете это сделать:

private MapboxMap map;

...

mapFragment.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(final MapboxMap mapboxMap) {

            map = mapboxMap;

        }
    });

...

// Wherever you implemented receiving the style string from MainActivity you can include this:

map.setStyleUrl(<style url>);

Если это не работает для вас, пожалуйста, дайте мне знать, как именно вы создаете фрагмент карты. В настоящее время SDK уже включает фрагмент, который вы можете настроить следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SupportMapFragment mapFragment;
    if (savedInstanceState == null) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        LatLng patagonia = new LatLng(-52.6885, -70.1395);

        MapboxMapOptions options = new MapboxMapOptions();
        options.accessToken("<your access token here>");
        options.styleUrl(Style.SATELLITE);
        options.camera(new CameraPosition.Builder()
                .target(patagonia)
                .zoom(9)
                .build());

        mapFragment = SupportMapFragment.newInstance(options);

        transaction.add(R.id.container, mapFragment, "mapFragment");
        transaction.commit();
    } else {
        mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentByTag("mapFragment");
    }

    mapFragment.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(final MapboxMap mapboxMap) {

            map = mapboxMap;

        }
    });
}

Если вы сделали это таким образом, вы можете легко изменить стиль карты, как я сказал выше.

Надеюсь, это поможет!

person cammace    schedule 25.04.2016
comment
Я обновил свой код. Вы можете посмотреть мой фрагмент и с помощью карты. - person Trinity; 25.04.2016
comment
Итак, как я могу изменить стиль карты, выбрав панель действий? - person Trinity; 25.04.2016
comment
Я думаю, вам нужно создать интерфейс для передачи строки из вашей активности в фрагмент. Было бы намного проще реализовать mapFragment, как я предложил в своем ответе. Весь показанный код будет работать одинаково, и вы можете напрямую изменить стиль карты. - person cammace; 26.04.2016
comment
извините, но я не мог этого сделать. фрагмент карты уже создан. Пользователь может выбрать стиль из панели действий. OnOptionsItemSelected вызывается, поэтому мне нужно заменить фрагмент или где написать свой код на моем фрагменте - person Trinity; 28.04.2016