Маркер Cumstom API Google Android отображает данные карты Google на специальном маркере - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать приложение для Android, которое должно показывать некоторые места на карте с помощью пользовательских маркеров. Когда щелкнул маркер, он показывает фрагмент, однако для моего приложения мне нужно показать информацию о картах Google о месте, как в приложении Google Maps. Мой XML прост:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.google.android.gms.maps.SupportMapFragment" />
</RelativeLayout>

У меня две проблемы:

  1. Достопримечательности Google Maps не активируются. Их значок виден на карте, но на них нельзя нажать.

  2. Когда щелкнул мой пользовательский маркер, я хочу показать информацию о карте Google, а не мой фрагмент.

Есть ли способы достичь этого?

1 Ответ

0 голосов
/ 10 января 2019

Для стр.1:

Сначала спрячьте все достопримечательности по умолчанию из Google Maps, как в этом ответе Jozef :

Вы можете сделать это просто путем изменения стиля карты: Добавление стилизованный Карта

  1. Создать файл JSON src \ main \ res \ raw \ map_style.json примерно так:

[
  {
    featureType: "poi",
    elementType: "labels",
    stylers: [
      {
        visibility: "off"
      }
    ]
  }
]
  1. Добавить стиль карты к вашему GoogleMap

googleMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(getContext(), R.raw.map_style));

Чем использовать Поиск мест из Google Places API и получить список точек интереса с помощью запроса ближайшего URL:

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=<LAT_LNG_e_g_ 32.944552,-97.129767>&types=point_of_interest&radius=<RADIUS_IN_METERS>&sensor=false&key=<YOUR_APP_KEY>

разберите его и программно покажите нужные места на карте как ваши кликабельные маркеры.

NB! Запрос соседнего URL-адреса возвращает только 20 мест, для загрузки дополнительных данных следует использовать строковое значение из тега ответа next_page_token и передать его через параметр pagetoken для следующего запроса:

 https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=<LAT_LNG_e_g_ 32.944552,-97.129767>&types=point_of_interest&radius=<RADIUS_IN_METERS>&sensor=false&key=<YOUR_APP_KEY>&pagetoken=<TOKEN_FOR_NEXT_PAGE_FROM_next_page_token_TAG_OF_RESPONSE>

И не забудьте включить API Places для вашего приложения из Консоль .

Для стр.2:

Используйте информацию из п. 1 ( Поиск места ) и предложено Вадимом Экслером в своем комментарии Сведения о месте в окне пользовательской информации Android Карт Google, как в это пример:

public class CustomInfoWindowGoogleMap implements GoogleMap.InfoWindowAdapter {

    private Context context;

    public CustomInfoWindowGoogleMap(Context ctx){
        context = ctx;
    }

    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }

    @Override
    public View getInfoContents(Marker marker) {
        View view = ((Activity)context).getLayoutInflater()
.inflate(R.layout.map_custom_infowindow, null);

        TextView name_tv = view.findViewById(R.id.name);
        TextView details_tv = view.findViewById(R.id.details);
        ImageView img = view.findViewById(R.id.pic);

        TextView hotel_tv = view.findViewById(R.id.hotels);
        TextView food_tv = view.findViewById(R.id.food);
        TextView transport_tv = view.findViewById(R.id.transport);

        name_tv.setText(marker.getTitle());
        details_tv.setText(marker.getSnippet());

        InfoWindowData infoWindowData = (InfoWindowData) marker.getTag();

        int imageId = context.getResources().getIdentifier(infoWindowData.getImage().toLowerCase(),
                "drawable", context.getPackageName());
        img.setImageResource(imageId);

        hotel_tv.setText(infoWindowData.getHotel());
        food_tv.setText(infoWindowData.getFood());
        transport_tv.setText(infoWindowData.getTransport());

        return view;
    }
}
...