bugfix> java > 投稿

こんにちは、Androidプログラミングは初めてで、ユーザーが国をクリックすると、別のアクティビティを開始して、首都を示すマーカーが付いた地図を表示するアプリがあります。

しかし、非同期タスクメソッドから資本を取得する必要があるため、国情報を返す必要があり、マップを更新する必要があります。onPostExecuteでマップ更新メソッドを呼び出しましたが、アプリがクラッシュしますか?

作成中

mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync( this);

    new GetCountryDetails().execute(selectedCountry);

次に、非同期タスクで

private class GetCountryDetails extends AsyncTask<String, String, CountryInfo> {
    @Override
    protected CountryInfo doInBackground(String... params) {
       CountryInfo countryInfo = null;

私のonPostExecuteで

protected void onPostExecute(CountryInfo countryInfo) {
    countryCapital=countryInfo.getCapital();
    updateMap(map);//doesn't work here

onMapReady:

public void onMapReady(GoogleMap map) {
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    map.getUiSettings().setMapToolbarEnabled(true);

updateMap

        public void updateMap(GoogleMap map){
    LatLng capitalCity = getCityLatitude(this, countryCapital);
       map.moveCamera(CameraUpdateFactory.newLatLng(capitalCity));
        MarkerOptions marker = new MarkerOptions().position(capitalCity).title( countryCapital);
        map.addMarker(marker);
    }

どんな助けも感謝します!

回答 2 件
  • Create Map varible as activity field.And define variable in onMapReady function.After that use activity variable as you want. I think it should works.
    GoogleMap map;
    public void onMapReady(GoogleMap map) {
        this.map = map;
        map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        map.getUiSettings().setMapToolbarEnabled(true);
    }
    
    

  • 以下のコードスニペットは私にとって完璧に機能します。試してみてください。

    private GoogleMap mMap;
    ArrayList<LatLngBean> arrayList;
    private ArrayList<LatLng> listLatLng;
    
    

    onPostExecuteメソッドに以下のコードを追加します

    LatLngBean bean = new LatLngBean();
    bean.setTitle(jobj.getString(""));
    bean.setSnippet("Hello, " + jobj.getString(""));
    bean.setLatitude(jobj.getString("latitude"));
    bean.setLongitude(jobj.getString("longitude"));
    arrayList.add(bean);
    runOnUiThread(new Runnable() {
     @Override
      public void run() {
        mapFragment.getMapAsync(YourActivity.this);
      }
    });
    
    

    次に、コードonMapReady()メソッドを追加します

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        if (arrayList.size() > 0) {
            try {
                listLatLng = new ArrayList<>();
                for (int i = 0; i < arrayList.size(); i++) {
                    final LatLngBean bean = arrayList.get(i);
                    double lat = Double.parseDouble(bean.getLatitude());
                    double lon = Double.parseDouble(bean.getLongitude());
                    LatLng latLng = new LatLng(lat, lon);
                    BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.salesman_map_icon);
                    mMap.addMarker(new MarkerOptions()
                            .position(latLng)
                            .title(bean.getTitle())
                            .snippet(String.valueOf(i))
                            //.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
                            .icon(icon));
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(17));
                    LatLng object = new LatLng(lat, lon);
                    listLatLng.add(object);
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
      }
    
    

あなたの答え