【问题标题】:Android, cannot resolve method getMap() [duplicate]Android,无法解析方法 getMap() [重复]
【发布时间】:2016-07-12 08:00:32
【问题描述】:

我对此代码有疑问,“无法解析方法 getMap()。 我没发现问题出在哪里,需要代码方面的帮助,我使用的是 Android Studio,需要使用 Json 获取 mySQL 的标记位置。

    googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMap();`

这是完整的代码

 public class MainActivity extends FragmentActivity {

    private GoogleMap googleMap;
    private Double Latitude = 0.00;
    private Double Longitude = 0.00;
    private GoogleApiClient client2;

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

        if (Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        ArrayList<HashMap<String, String>> location = null;
        String url = "http://www.evil.cl/getLatLon.php";
        try {

            JSONArray data = new JSONArray(getHttpGet(url));

            location = new ArrayList<HashMap<String, String>>();
            HashMap<String, String> map;

            for (int i = 0; i < data.length(); i++) {
                JSONObject c = data.getJSONObject(i);

                map = new HashMap<String, String>();
                map.put("LocationID", c.getString("LocationID"));
                map.put("Latitude", c.getString("Latitude"));
                map.put("Longitude", c.getString("Longitude"));
                map.put("LocationName", c.getString("LocationName"));
                location.add(map);

            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMap();

        Latitude = Double.parseDouble(location.get(0).get("Latitude").toString());
        Longitude = Double.parseDouble(location.get(0).get("Longitude").toString());
        LatLng coordinate = new LatLng(Latitude, Longitude);
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(coordinate, 17));

        for (int i = 0; i < location.size(); i++) {
            Latitude = Double.parseDouble(location.get(i).get("Latitude").toString());
            Longitude = Double.parseDouble(location.get(i).get("Longitude").toString());
            String name = location.get(i).get("LocationName").toString();
            MarkerOptions marker = new MarkerOptions().position(new LatLng(Latitude, Longitude)).title(name);
            googleMap.addMarker(marker);
        }

        client2 = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }

    public static String getHttpGet(String url) {
        StringBuilder str = new StringBuilder();
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        try {
            HttpResponse response = client.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    str.append(line);
                }
            } else {
                Log.e("Log", "Failed to download result..");
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str.toString();
    }

    @Override
    public void onStart() {
        super.onStart();
        client2.connect();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW,
                "Main Page", 


                Uri.parse("http://host/path"),

                Uri.parse("android-app://com.example.hector.prueba1/http/host/path")
        );
        AppIndex.AppIndexApi.start(client2, viewAction);
    }

    @Override
    public void onStop() {
        super.onStop();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW,
                "Main Page", 
                Uri.parse("http://host/path"),
                Uri.parse("android-app://com.example.hector.prueba1/http/host/path")
        );
        AppIndex.AppIndexApi.end(client2, viewAction);
        client2.disconnect();
    }
}

【问题讨论】:

    标签: android google-maps google-maps-markers


    【解决方案1】:

    getMap() 方法已弃用,但现在在 play-services 9.2 更新后,它已被删除,因此最好使用 getMapAsync()。仅当您不愿意将应用程序的播放服务更新到 9.2 时,您仍然可以使用 getMap()。

    要使用 getMapAsync(),请在您的活动或片段上实现 OnMapReadyCallback 接口:

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

    然后,在初始化地图时,使用 getMapAsync() 而不是 getMap():

     private void initializeMap() {
      if (mMap == null) {
        SupportMapFragment mapFrag = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.fragment_map);
        mapFrag.getMapAsync(this);
      }
    }
    
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        setUpMap();
    }
    

    【讨论】:

      【解决方案2】:

      getMap 不推荐使用getMapAsync 下面的方式..

      所以把这个googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMap();改成这个googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.googleMap)).getMapAsync();

      更新日期:

      这样用,

      package your.app.name;
      
      import android.app.Activity;
      import android.os.Bundle;
      import android.view.Menu;
      import android.view.MenuItem;
      
      import com.google.android.gms.maps.GoogleMap;
      import com.google.android.gms.maps.MapFragment;
      import com.google.android.gms.maps.OnMapReadyCallback;
      import com.google.android.gms.maps.model.LatLng;
      import com.google.android.gms.maps.model.MarkerOptions;
      
      public class MainActivity extends Activity implements OnMapReadyCallback {
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              MapFragment mapFragment = (MapFragment) getFragmentManager()
                      .findFragmentById(R.id.map);
              mapFragment.getMapAsync(this);
          }
      
          @Override
          public void onMapReady(GoogleMap map) {
              map.addMarker(new MarkerOptions()
                      .position(new LatLng(0, 0))
                      .title("Marker"));
          }
      
          //onCreateOptionsMenu: no changes    
          //onOptionsItemSelected: no changes
      }
      

      【讨论】:

      • 我该如何解决这个错误? supportmapfragment中的getmapasync(onmapreadycallback)不能应用到
      • @HectorAndresPiñonesGonzalez 查看我的更新答案。
      • 在我看来,你应该完全删除不正确的 map = ...async 部分,只留下“更新”部分,因为那是正确的部分。
      【解决方案3】:

      我现在在加载 Json 时遇到问题,“getMap”已弃用,谷歌说我必须使用 getMap()。 如何解决问题?

      这个你有代码

              try {
              JSONArray innerJsonArray = json_array.getJSONArray(0);
              JSONObject json = innerJsonArray.getJSONObject(0);
              MapFragment mapFrag = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
              GeoJsonLayer layer = new GeoJsonLayer(mapFrag.getMap() , json);
              layer.addLayerToMap();
      
          } catch (JSONException e) {
              e.printStackTrace();
          }
      

      完整代码:

       public class MainActivity extends AppCompatActivity
              implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback {
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
              setSupportActionBar(toolbar);
      
              DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
              ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
              drawer.setDrawerListener(toggle);
              toggle.syncState();
      
              NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
              navigationView.setNavigationItemSelectedListener(this);
      
              SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                      .findFragmentById(R.id.map);
              mapFragment.getMapAsync(this);
          }
      
          @Override
          public void onBackPressed() {
              DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
              if (drawer.isDrawerOpen(GravityCompat.START)) {
                  drawer.closeDrawer(GravityCompat.START);
              } else {
                  super.onBackPressed();
              }
          }
      
          @Override
          public boolean onCreateOptionsMenu(Menu menu) {
              // Inflate the menu; this adds items to the action bar if it is present.
              getMenuInflater().inflate(R.menu.main, menu);
              return true;
          }
      
          @Override
          public boolean onOptionsItemSelected(MenuItem item) {
              // Handle action bar item clicks here. The action bar will
              // automatically handle clicks on the Home/Up button, so long
              // as you specify a parent activity in AndroidManifest.xml.
              int id = item.getItemId();
      
              //noinspection SimplifiableIfStatement
              if (id == R.id.action_settings) {
                  return true;
              }
      
              return super.onOptionsItemSelected(item);
          }
      
          @SuppressWarnings("StatementWithEmptyBody")
          @Override
          public boolean onNavigationItemSelected(MenuItem item) {
              // Handle navigation view item clicks here.
              int id = item.getItemId();
      
              if (id == R.id.nav_camera) {
                  // Handle the camera action
              } else if (id == R.id.nav_gallery) {
      
              } else if (id == R.id.nav_slideshow) {
      
              } else if (id == R.id.nav_manage) {
      
              } else if (id == R.id.nav_share) {
      
              } else if (id == R.id.nav_send) {
      
              }
      
              DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
              drawer.closeDrawer(GravityCompat.START);
              return true;
          }
      
      
          @Override
          public void onMapReady(GoogleMap googleMap) {
              googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
              //JSONArray json = new JSONObject();
              StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
              StrictMode.setThreadPolicy(policy);
      
              String url = "https://www.oxidocs.com/ind/modelo/test.php";
      
              JSONArray user = null;
      
              // Creating new JSON Parser
              JSONParser jParser = new JSONParser();
      
              // Getting JSON from URL
              JSONArray json_array = jParser.getJSONFromUrl(url);
      
      
              try {
                  JSONArray innerJsonArray = json_array.getJSONArray(0);
                  JSONObject json = innerJsonArray.getJSONObject(0);
                  MapFragment mapFrag = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
                  GeoJsonLayer layer = new GeoJsonLayer(mapFrag.getMap() , json);
                  layer.addLayerToMap();
      
              } catch (JSONException e) {
                  e.printStackTrace();
              }
          }
      
      }
      

      【讨论】:

        【解决方案4】:
        public class MapPane extends FragmentActivity implements OnMapReadyCallback {
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.map_activity);
        
            SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager()
                    .findFragmentById(R.id.safety_map));
            mapFragment.getMapAsync(this);
        }
        
        @Override
        public void onMapReady(GoogleMap map) {
        //DO WHATEVER YOU WANT WITH GOOGLEMAP
         map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                map.setMyLocationEnabled(true);
                map.setTrafficEnabled(true);
                map.setIndoorEnabled(true);
                map.setBuildingsEnabled(true);
                map.getUiSettings().setZoomControlsEnabled(true);
            }
        }
        

        它将完美运行。谢谢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-12
          • 1970-01-01
          • 1970-01-01
          • 2016-05-21
          • 1970-01-01
          相关资源
          最近更新 更多