Google map v2 Custom Infowindow с двумя кнопками clickable или ImageView

enter image description here

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

Ответы

Ответ 1

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

Вы можете увидеть рецепт в этом ответе: fooobar.com/questions/37642/...

И работающая реализация Google Play.

Ответ 2

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 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>

теперь скопируйте следующие файлы из ссылки fooobar.com/questions/37642/...

  • mapwrapperlauot (укажите название своего пакета в теге)
  • MapWrapperLayout.java
  • OnInfoWindowElemTouchListener.java

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

Ответ 3

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

UPEDATE: Из Документов:

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

Ответ 4

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

https://github.com/Appolica/InteractiveInfoWindowAndroid

Ответ 5

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

выходные снимки экрана: -

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Загрузить полный исходный код проекта Нажмите здесь

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