Как открыть карту Google, нажав на элемент listview?
Мне нужна помощь от кого-то, кто знает, как использовать карты в Android Studio. Меня интересует, как открыть карту G., щелкнув по элементу listview из фрагмента.Это мой код.:
Это код из фрагмента:
@OnItemClick(R.id.lvTours) public void onItemClick(int position) { String tour = ((Tours) lvTours.getAdapter().getItem(position)).getCoord();//coordinats are stored on Firebase Intent showMap = new Intent(getContext(), MapActivity.class); showMap.putExtra(MapActivity.COORD, longitude); showMap.putExtra(MapActivity.COORD, latitude); showMap.putExtra(MapActivity.COORD, tour); startActivity(showMap); }
И это MapActivity:
public class MapActivity extends AppCompatActivity implements OnMapReadyCallback, LocationSource.OnLocationChangedListener { public static final String COORD = "coord"; private GoogleMap.OnMapClickListener mCustomOnMapClickListener; private GoogleMap mGoogleMap; LocationManager mLocationManager; private Criteria mCriteria; private String mShowMap; private LocationSource.OnLocationChangedListener mListener; @BindView(R.id.lvTours) ListView lvTours; private SupportMapFragment mSupportMapFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tours_coord); this.mSupportMapFragment = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.fGoogleMap); this.mSupportMapFragment.getMapAsync(this); this.mCriteria = new Criteria(); this.mCriteria.setAccuracy(Criteria.ACCURACY_FINE); this.mLocationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE); this.mCustomOnMapClickListener = new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { MarkerOptions newMarkerOptions = new MarkerOptions(); newMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.tour)); newMarkerOptions.title("Tour"); newMarkerOptions.snippet("It' was here!"); newMarkerOptions.position(latLng); mGoogleMap.addMarker(newMarkerOptions); this.handleStartingIntent(); } private void handleStartingIntent() { Bundle bundle = getIntent().getExtras(); if (bundle.containsKey(COORD)) { mShowMap = bundle.getString(COORD); } } }; } @Override public void onMapReady(GoogleMap googleMap) { this.mGoogleMap = googleMap; UiSettings uiSettings = this.mGoogleMap.getUiSettings(); uiSettings.setZoomControlsEnabled(true); uiSettings.setMyLocationButtonEnabled(true); uiSettings.setZoomGesturesEnabled(true); this.mGoogleMap.setOnMapClickListener(this.mCustomOnMapClickListener); // goToLocation(33.835293 , -117.914505); } @Override public void onLocationChanged(Location location) { if (mListener != null) { mListener.onLocationChanged(location); //Move the camera to the user's location and zoom in! mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 12.0f)); } } public void goToLocation(double lat, double lng) { LatLng latLng = new LatLng(lat, lng); CameraPosition position = CameraPosition.builder() .target(latLng) .zoom(16f) .bearing(0.0f) .tilt(0.0f) .build(); mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(position), null); } }
Я был бы благодарен всем, кто дал бы мне пример того, как решить эту проблему.Спасибо.
Что я уже пробовал:
Он попытался найти решение с помощью Google.
David Crow
Что именно происходит? Создается ли исключение? Открывается ли карта, но это неправильное местоположение? Быть конкретными.
Я вижу, что вы храните широту, долготу и тур, используя один и тот же ключ. Затем, когда вы читаете этот ключ в handleStartingIntyent()
- ты ничего с ним не сделаешь. Это намеренно?
Member 13593129
Это не намеренно, но я попробую ваш код, который вы предоставили, и дам вам знать.
Member 13593129
Это не работает. Я получаю NP на "private double dLongitude = 0.0;" и "setContentView(R. layout.tours_coord);". Я напишу, как это выглядит сейчас.
открытый класс MapActivity расширяет FragmentActivity реализует OnMapReadyCallback {
отдельный двухместный dLatitude = 0.0;
отдельный двухместный dLongitude = 0.0;
общедоступные статические заключительные строки КООРД = "коорд";
частная строка mTours;
частная проезде через mmap;
частная проезде.OnMapClickListener mCustomOnMapClickListener;
@Ручная коррекция
protected void onCreate(Bundle savedInstanceState) {
супер.метод onCreate(savedInstanceState);
setContentView(R. layout.tours_coord);
// Получите SupportMapFragment и получите уведомление, когда карта будет готова к использованию.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R. id.fGoogleMap);
mapFragment.getMapAsync(это);
Пачка пачка = так().getExtras();
dLatitude = bundle.getDouble("широта");
dLongitude = bundle.getDouble("долгота");
если (пачке.containsKey(рук)) {
mTours = пачке.метода getString(КООРД);
}
}
@Ручная коррекция
общественного недействительными onMapReady(расчет проезде) {
вызов mmap = проезде;
LatLng latlng = новый LatLng(dLatitude, dLongitude);
mMap.addMarker(new MarkerOptions().position(latlng).title("Это было здесь"));
вызов mmap.moveCamera(CameraUpdateFactory.newLatLng(latlng с));
этот.mCustomOnMapClickListener = новый GoogleMap.OnMapClickListener() {
@Ручная коррекция
общественного недействительными onMapClick(latlng с latlng с) {
MarkerOptions newMarkerOptions = новые MarkerOptions();
newMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R. mipmap.tour));
newMarkerOptions.title("тур");
newMarkerOptions.snippet("это было здесь!");
newMarkerOptions.положение(latlng с);
вызов mmap.addMarker(newMarkerOptions);
}
};
}
}
@OnItemClick(R. id.lvTours)
public void onItemClick(int position) {
Строка t = ((Tours)lvTours.getAdapter().getItem(position)).getCoord();
Intent i = новое намерение(getContext(), MapActivity.class);
i.putExtra("широта", 33.835293);
i.putExtra("долгота", -117.914505);
i.putExtra(MapActivity.Координата, Т);
startActivity(i);
}
David Crow
- Это не работает. Я получаю NP на 'private double dLongitude = 0.0;'"
Я не уверен, как это возможно, поскольку здесь нет никаких объектов. Это NullpointerException
исключение выбрасывается? Как вы это проверяете?
Вызов setContentView()
это нормально (опять же, никаких объектов), но что-то внутренне могло пойти наперекосяк, когда фреймворк попытался раздуть tours_coord
расположение.
Member 13593129
Я вел себя как идиот. Я забыл поставить API_KEY, вот почему это не сработало. Хотя, у меня есть еще один вопрос.Это работает, но показывает только одно место.Я хочу, когда я нажимаю на каждый элемент, чтобы показать другое место. Потому что у меня 27 туров, и они были не на одном месте. У вас есть идея, как это сделать?
David Crow
В onMapReady()
метод, сделайте дополнительные звонки на addMarker()
.
Member 13593129
Теперь все работает, кроме одного. Я сохранил свой coord(lat, lng) на Firebase, и проблема в том, что на какой бы элемент я ни нажал, он всегда открывается в одном и том же месте(Анахайм), потому что эти coord находятся здесь:
i.putExtra("широта", 33.835293);
i.putExtra("долгота", -117.914505);
Я пытался изменить это таким образом, но это не работает:
@OnItemClick(R. id.lvTours)
public void onItemClick(int position) {
Строка t = ((Tours)lvTours.getAdapter().getItem(position)).getLat();
Строка tr = ((Tours)lvTours.getAdapter().getItem(position)).getLng();
Intent i = новое намерение(getContext(), MapActivity.class);
i.putExtra("лат", 33.835293);
i.putExtra("СПГ", -117.914505);
i.putExtra(MapActivity.Лат, Т);
i.putExtra(MapActivity.СПГ, тр);
startActivity(i);
}
}
И в MapActivity:
Пачка пачка = так().getExtras();
dLatitude = bundle.getDouble("лат");
dLongitude = bundle.getDouble("Lng");
if (bundle.containsKey(лат)) {
mTours = пачке.и getString(лат, СПГ);
}
Это моя последняя проблема. После этого я больше не буду вас беспокоить.
Большое спасибо за вашу помощь.
David Crow
Ваши последние два звонка в putExtra()
использующийся MapActivity.Lat
и MapActivity.Lng
, но ваши два звонка к getDouble()
используются клавиши "Lat" и "Lng".
В дополнение, t
и tr
являются String
типы пока dLatitude
и dLongitude
являются double
типы.
Member 13593129
Как, по-твоему, я должен решить эту проблему?
David Crow
Серьезно?
dLatitude = bundle.getDouble(Lat); dLongitude = bundle.getDouble(Lng);
Member 13593129
Это у меня уже есть. И это работает, проблема в том, что открывается карта с одним и тем же местоположением.
David Crow
- Это у меня уже есть."
Я так не думаю.
"...проблема в том, что открывается карта с одним и тем же местоположением."
Потому что вы извлекаете статические координаты из пакета (а не из Firebase).
Member 13593129
Ладно, я понял. Как это изменить, чтобы вытягивать lat и lng из Firebase, а не из bundle?
David Crow
Разве вы уже не получаете координаты с помощью:
String t = ((Tours)lvTours.getAdapter().getItem(position)).getLat(); String tr = ((Tours)lvTours.getAdapter().getItem(position)).getLng();Независимо от того, откуда они берутся, вам все равно нужно поместить их в пакет намерения, чтобы их можно было извлечь в
onMapReady()
.
Member 13593129
По какой-то причине он этого не делает.Не знаю, в чем тут дело.
Я сделал то же самое для YT videos, где у меня есть URL, хранящийся на FB, и он работает безупречно.
David Crow
Так что же тогда хранится внутри t
и tr
?
Member 13593129
Как видите. В первом одна широта, а во втором одна долгота.
David Crow
Ранее вы сказали, - По какой-то причине он этого не делает. Не знаю, в чем тут дело." А до этого ты сказал, - Как это изменить, чтобы вытащить лат и СПГ с огневой базы." Это противоречит тому, что вы только что сказали. Либо вы получаете координаты, либо нет. И что же это такое?
Member 13593129
Я не понимаю координаты.
David Crow
Тогда отображение карты с маркерами здесь не является проблемой (или, по крайней мере, больше не является). Начните новую тему, предпочтительно на самом форуме Android, чтобы поговорить о реальной проблеме с извлечением данных из хранилища Firebase.
Member 13593129
Хорошо. Спасибо за вашу помощь.