2016-04-25 16 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

これで、どのようにマップスタイルをアクションバーの選択から変更できますか? – Trinity

+0

私はあなたのアクティビティからの文字列をフラグメントに渡すためのインターフェイスを作成する必要があると思います。私の答えで示唆したように、mapFragmentを実装する方がはるかに簡単です。表示されるすべてのコードは同じように動作し、マップスタイルを直接変更することができます。 – cammace

関連する問題