2016-04-25 84 views
2

我正在使用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); 
       } 
      } 
     } 
    } 

回答

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; 

     } 
    }); 
} 

如果你這樣做了,你可以很容易地改變地圖的風格就像我上面說的。

希望這可以幫到你!

+0

我已更新我的代碼。你可以看看我的片段和使用地圖。 – Trinity

+0

那麼我怎樣才能從選擇操作欄更改mapstyle? – Trinity

+0

我認爲你需要創建一個接口將字符串從你的活動傳遞給fragment。像我在我的答案中所建議的那樣實現mapFragment會容易得多。你所顯示的所有代碼都可以工作,你可以直接改變地圖樣式。 – cammace