2016-12-19 1 views
-1

Я уже некоторое время пытался отображать на карте несколько маркеров, и я постоянно сталкиваюсь с ошибками.
Мне удалось найти этот код, но я попал в аварию.Карты Google - показать много маркеров на карте

Вот мой mapsActivity.java

package com.example.moses.ngongapp; 

import android.app.Dialog; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.view.ViewTreeObserver; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.LatLngBounds; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 


import java.util.ArrayList; 
import java.util.HashMap; 



    public class MapsActivity extends FragmentActivity { 

     private GoogleMap googleMap; 
     private ArrayList<LatLng> listLatLng; 
     private RelativeLayout rlMapLayout; 
     HashMap<Marker, LatLngBean> hashMapMarker = new HashMap<Marker, LatLngBean>(); 

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

      rlMapLayout = (RelativeLayout) findViewById(R.id.rlMapLayout); 

      setUpMapIfNeeded(); 
      setData(); 

     } 

     private void setData() { 
      ArrayList<LatLngBean> arrayList = new ArrayList<LatLngBean>(); 
      LatLngBean bean = new LatLngBean(); 
      bean.setTitle("Ahmedabad"); 
      bean.setSnippet("Hello,Ahmedabad"); 
      bean.setLatitude("23.0300"); 
      bean.setLongitude("72.5800"); 
      arrayList.add(bean); 

      LatLngBean bean1 = new LatLngBean(); 
      bean1.setTitle("Surat"); 
      bean1.setSnippet("Hello,Surat"); 
      bean1.setLatitude("21.1700"); 
      bean1.setLongitude("72.8300"); 
      arrayList.add(bean1); 

      LatLngBean bean2 = new LatLngBean(); 
      bean2.setTitle("Vadodara"); 
      bean2.setSnippet("Hello,Vadodara"); 
      bean2.setLatitude("22.3000"); 
      bean2.setLongitude("73.2000"); 
      arrayList.add(bean2); 

      LoadingGoogleMap(arrayList); 
     } 

     /** 
     * @author Hasmukh Bhadani 
     * Set googleMap if require 
     */ 
     private void setUpMapIfNeeded() { 
      int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); 

      // Google Play Services are not available 
      if (status != ConnectionResult.SUCCESS) { 
       int requestCode = 10; 
       Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); 
       dialog.show(); 

      } else if (googleMap == null) { 
       ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMapAsync((OnMapReadyCallback) this); 
       if (googleMap != null) { 
        googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         // TODO: Consider calling 
         // ActivityCompat#requestPermissions 
         // here to request the missing permissions, and then overriding 
         // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
         //           int[] grantResults) 
         // to handle the case where the user grants the permission. See the documentation 
         // for ActivityCompat#requestPermissions for more details. 
         return; 
        } 
        googleMap.setMyLocationEnabled(true); 
        googleMap.getUiSettings().setMyLocationButtonEnabled(true); 
        googleMap.getUiSettings().setZoomControlsEnabled(true); 
       } 
      } 
     } 

     /** 
     * @author Hasmukh Bhadani 
     * Loading Data to the GoogleMap 
     */ 
// -------------------------Google Map 
     void LoadingGoogleMap(ArrayList<LatLngBean> arrayList) { 
      if (googleMap != null) { 
       googleMap.clear(); 
       googleMap.getUiSettings().setMyLocationButtonEnabled(true); 
       if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
        // TODO: Consider calling 
        // ActivityCompat#requestPermissions 
        // here to request the missing permissions, and then overriding 
        // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
        //           int[] grantResults) 
        // to handle the case where the user grants the permission. See the documentation 
        // for ActivityCompat#requestPermissions for more details. 
        return; 
       } 
       googleMap.setMyLocationEnabled(true); 
       googleMap.getUiSettings().setZoomControlsEnabled(true); 

       if (arrayList.size() > 0) { 
        try { 
         listLatLng = new ArrayList<LatLng>(); 
         for (int i = 0; i < arrayList.size(); i++) { 
          LatLngBean bean = arrayList.get(i); 
          if (bean.getLatitude().length() > 0 && bean.getLongitude().length() > 0) { 
           double lat = Double.parseDouble(bean.getLatitude()); 
           double lon = Double.parseDouble(bean.getLongitude()); 

           Marker marker = googleMap.addMarker(new MarkerOptions() 
             .position(new LatLng(lat, lon)) 
             .title(bean.getTitle()) 
             .snippet(bean.getSnippet()) 
             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 

           //Add Marker to Hashmap 
           hashMapMarker.put(marker, bean); 

           //Set Zoom Level of Map pin 
           LatLng object = new LatLng(lat, lon); 
           listLatLng.add(object); 
          } 
         } 
         SetZoomlevel(listLatLng); 
        } catch (NumberFormatException e) { 
         e.printStackTrace(); 
        } 

        googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { 

         @Override 
         public void onInfoWindowClick(Marker position) { 
          LatLngBean bean = hashMapMarker.get(position); 
          Toast.makeText(getApplicationContext(), bean.getTitle(), Toast.LENGTH_SHORT).show(); 

         } 
        }); 
       } 
      } else { 
       Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show(); 
      } 
     } 

     /** 
     * @author Hasmukh Bhadani 
     * Set Zoom level all pin withing screen on GoogleMap 
     */ 
     public void SetZoomlevel(ArrayList<LatLng> listLatLng) { 
      if (listLatLng != null && listLatLng.size() == 1) { 
       googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(listLatLng.get(0), 10)); 
      } else if (listLatLng != null && listLatLng.size() > 1) { 
       final LatLngBounds.Builder builder = LatLngBounds.builder(); 
       for (int i = 0; i < listLatLng.size(); i++) { 
        builder.include(listLatLng.get(i)); 
       } 

       final ViewTreeObserver treeObserver = rlMapLayout.getViewTreeObserver(); 
       treeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
        @SuppressWarnings("deprecation") 
        @Override 
        public void onGlobalLayout() { 
         if (googleMap != null) { 
          googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), findViewById(R.id.map) 
            .getWidth(), findViewById(R.id.map).getHeight(), 80)); 
          rlMapLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
         } 
        } 
       }); 

      } 
     } 
    } 

мой LogCat здесь

FATAL EXCEPTION: main 
Process: com.example.moses.ngongapp, PID: 28132 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.moses.ngongapp/com.example.moses.ngongapp.MapsActivity}: java.lang.ClassCastException: com.example.moses.ngongapp.MapsActivity cannot be cast to com.google.android.gms.maps.OnMapReadyCallback 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
    at android.app.ActivityThread.access$800(ActivityThread.java:156) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:211) 
    at android.app.ActivityThread.main(ActivityThread.java:5371) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:945) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:740) 
Caused by: java.lang.ClassCastException: com.example.moses.ngongapp.MapsActivity cannot be cast to com.google.android.gms.maps.OnMapReadyCallback 
    at com.example.moses.ngongapp.MapsActivity.setUpMapIfNeeded(MapsActivity.java:90) 
    at com.example.moses.ngongapp.MapsActivity.onCreate(MapsActivity.java:44) 
+0

Где мой метод onMapReady()? –

+0

@RishabhMahatha теперь загружается, но мои маркеры не отображаются, это дает «извините, не удалось создать карты» .. почему arent мои маркеры видны? –

ответ

0
@Override 
public void onMapReady(GoogleMap map) { 
    this.googleMap = map; 

    setUpMapIfNeeded(); 
    setData() 
} 

ли карта связанные вещи в onMapReady().

+0

Упражнение должно реализовать 'OnMapReadyCallback' для этого, чтобы он работал –

+0

@ cricket_007 теперь он загружается, но мои маркеры не отображаются, он дает« извините, не удалось создать карты ».. почему arent мои маркеры видны? –

1

Ошибка здесь

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

Ошибка ясно говорит "MapsActivity cannot be cast to com.google.android.gms.maps.OnMapReadyCallback".

Так, только реализовать этот интерфейс

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 

и осуществлять соответствующий onMapReady метод из этого интерфейса.

Затем вам не нужно бросать. Просто getMapAsync(MapsActivity.this)

Также не делают каких-либо функций, связанных с GoogleMap до внутри или после этого метода.

Что касается ваших комментариев, вам необходимо проследить ваш код, чтобы точно, почему if (googleMap != null) { не вводится. Потому что карта нулевая - очевидно. Но почему? Потому что getMapAsync будет «ждать», пока карта не будет готова, и в какой момент getMapAsync вызывается в какой-то неопределенной точке в будущем (следовательно, Async работает в фоновом режиме).

Другими словами, не называют setUpMapIfNeeded или УстановитьДанные метод в OnCreate, но вместо этого только тогда, когда карта становится доступной (от параметра к onMapReady метода)

@Override 
public void onMapReady(GoogleMap map) { 
    this.googleMap = map; 

    setUpMapIfNeeded(); 
    setData(); // this calls LoadingGoogleMap() 
} 

Если маркеры еще не являются видимый, затем продолжите отладку кода. Этот ответ предназначен только для устранения ошибки, упомянутой в вопросе.


Кстати, your previous question was already implementing the interface

+0

теперь загружается, но мои маркеры не отображаются, это дает «извините, не удалось создать карты» .. почему arent мои маркеры видны? –

+0

Очевидно. 'else {Тост.makeText (getApplicationContext(), «Извините, не удалось создать карты», Toast.LENGTH_SHORT) .show(); } '... Другими словами, вы не выполнили мою заметку - не делайте никаких ** функций, связанных с GoogleMap, до тех пор, пока этот метод getMapAsync или после этого не будет **, это будет null **, и поэтому вы ударите все те другие заявления –

+0

извините, но можете ли вы прояснить, после этого есть много кода, где я должен их поставить ???? я растерялся, пожалуйста, –

1

Вы можете imolement нового метода, как onMapReady и остальная часть работы относительно Интите этот метод.

((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)). 
    getMapAsync(new OnMapReadyCallback() 

      @Override 
      public void onMapReady(GoogleMap map) { 
      this.googleMap = map; 
      setUpMapIfNeeded(); 
      setData() 
     }); 
+0

Можете ли вы помочь мне сделать маркеры видимыми, код работает, но мои маркеры не видны? –

 Смежные вопросы

  • Нет связанных вопросов^_^