Google map V2 пользовательский Infowindow с двумя кнопками или ImageView

enter image description here

Мне нужно пользовательское информационное окно с двумя кнопками, как указано выше.В нем, когда более чем маркер и нажмите любой из них, то окно должно быть открыто, и когда нажмите на другой маркер другое окно должно открыть и закрыть предыдущее окно, а также в один клик. есть ли какая-либо конкретная причина ,почему google map v2 не поддерживает живой компонент, такой как кнопка, флажок?

5 ответов


Что вы пытаетесь достичь можно.

вы можете увидеть рецепт в этом ответе:https://stackoverflow.com/a/15040761/2183804

и рабочая реализация на Google Play.


MainActivity.java

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainActivity extends Activity {

  private ViewGroup infoWindow;
  private TextView infoTitle;
  private TextView infoSnippet;
  private Button infoButton1, infoButton2;
  private OnInfoWindowElemTouchListener infoButtonListener;

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

    final MapFragment mapFragment =
        (MapFragment) getFragmentManager().findFragmentById(R.id.map);
    final MapWrapperLayout mapWrapperLayout =
        (MapWrapperLayout) findViewById(R.id.map_relative_layout);
    final GoogleMap map = mapFragment.getMap();


    mapWrapperLayout.init(map, getPixelsFromDp(this, 39 + 20));

    final Marker ki = map.addMarker(new MarkerOptions()
        .position(new LatLng(50.08, 14.43))
        .icon(BitmapDescriptorFactory
            .fromResource(R.drawable.circles)));

    infoWindow = (ViewGroup) getLayoutInflater()
        .inflate(R.layout.activity_main, null);
    infoButton1 = (Button) infoWindow.findViewById(R.id.b1);
    infoButton2 = (Button) infoWindow.findViewById(R.id.b2);

    infoButtonListener = new OnInfoWindowElemTouchListener(infoButton1,
        getResources().getDrawable(R.drawable.ic_launcher),
        getResources().getDrawable(R.drawable.ic_launcher)) {
      @Override
      protected void onClickConfirmed(View v, Marker marker) {
        Toast.makeText(getApplicationContext(),
            "click on button 1", Toast.LENGTH_LONG).show();
      }
    };
    infoButton1.setOnTouchListener(infoButtonListener);


    infoButtonListener = new OnInfoWindowElemTouchListener(infoButton2,
        getResources().getDrawable(R.drawable.ic_launcher),
        getResources().getDrawable(R.drawable.ic_launcher)) {
      @Override
      protected void onClickConfirmed(View v, Marker marker) {
        Toast.makeText(getApplicationContext(),
            "click on button 2", Toast.LENGTH_LONG).show();
      }
    };
    infoButton2.setOnTouchListener(infoButtonListener);

    infoWindow.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
      }
    });

    map.setInfoWindowAdapter(new InfoWindowAdapter() {
      @Override
      public View getInfoWindow(Marker marker) {
        infoButtonListener.setMarker(marker);
        mapWrapperLayout.setMarkerWithInfoWindow(marker, infoWindow);
        return infoWindow;
      }

      @Override
      public View getInfoContents(Marker marker) {
        // Setting up the infoWindow with current's marker info
        return null;
      }
    });
    ki.showInfoWindow();

    map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(50.08, 14.43), 15));
    map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
  }

  public static int getPixelsFromDp(Context context, float dp) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
  }
}

activity_main

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:background="@drawable/marker" >

        <Button 
            android:id="@+id/b1"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="Button1" 
            android:layout_marginBottom="10dp"   />

        <Button 
            android:id="@+id/b2"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="Button2"
            android:layout_marginBottom="10dp"    />

    </LinearLayout>
</RelativeLayout>

теперь скопируйте следующие файлы из ссылки https://stackoverflow.com/a/15040761/2183804

  1. mapwrapperlauot (включите имя пакета в тег)
  2. MapWrapperLayout.java
  3. OnInfoWindowElemTouchListener.java

Он будет работать.


Я построил образец проекта Android studio для этого вопроса.

выход скриншоты :-

enter image description here

enter image description here

enter image description here

скачать полный исходный код проекта выберите здесь

обратите внимание: вы должны добавить свой ключ API в Androidmanifest.в XML


то, чего вы пытаетесь достичь, невозможно. Даже если вы создадите XML-макет для вас info-window. Содержимое информационного окна визуализируется и представляется в виде изображения на картах. Таким образом, он может принимать только один прослушиватель щелчка для всего окна. вы не можете указать количество различных кликов для этого окна.

обновление: От Docs:

Примечание: информационное окно, которое рисуется не является живым видом. Вид изображения (с помощью зрения.draw (Canvas)) в момент его возврата. Это означает, что любые последующие изменения не будут отражаться в окне информации о карте. Чтобы обновить информационное окно позже (например, после загрузки изображения), вызовите showInfoWindow (). Кроме того, информационное окно не будет уважать любую интерактивность, типичную для обычного представления, такого как события касания или жеста. Однако вы можете прослушать общее событие click во всем информационном окне, как описано в разделе под.


на самом деле есть библиотека, которая может решить вашу проблему и добавить информационное окно, которое в режиме реального времени и вы можете взаимодействовать с ним.

https://github.com/Appolica/InteractiveInfoWindowAndroid