Я хочу разместить пользовательский макет над маркером. До сих пор я получил это:Всплывающие окна или макет над маркером Android
default_marker_info_window.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ViewFlipper
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/markerInfoContainer"
android:background="@android:color/holo_red_dark"
android:maxWidth="250dp">
</ViewFlipper>
<ImageView
android:layout_width="20dp"
android:layout_height="15dp"
android:background="@drawable/ic_down_arrow"
android:layout_gravity="center|top"/>
</LinearLayout>
default_marker_info_layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tvTitulo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:gravity="center"/>
<TextView
android:id="@+id/tvCuerpo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="press me 1"
android:id="@+id/button"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="press me 2"
android:id="@+id/button2"/>
</LinearLayout>
</LinearLayout>
MapActivity.java
public class MapActivity extends Activity implements GoogleMap.OnMapLongClickListener{
protected GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
setUpMapIfNeeded();
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
View mainView = getLayoutInflater().inflate(R.layout.default_marker_info_window, null);
ViewFlipper markerInfoContainer = (ViewFlipper)mainView.findViewById(R.id.markerInfoContainer);
View viewContainer = getLayoutInflater().inflate(R.layout.default_marker_info_layout, null);
TextView tvTitulo = (TextView) viewContainer.findViewById(R.id.tvTitulo);
TextView tvCuerpo = (TextView) viewContainer.findViewById(R.id.tvCuerpo);
tvTitulo.setText(marker.getTitle());
tvCuerpo.setVisibility(View.GONE);
markerInfoContainer.addView(viewContainer);
PopupWindow popupWindow = new PopupWindow(mainView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.showAtLocation(findViewById(R.id.map), Gravity.CENTER_HORIZONTAL, 0, 0); //map is the fragment on the activity layout where I put the map
return true;
}
});
...
}
...
}
Но у меня есть несколько проблем.
Задача 1: всплывающее окно отображает (3D) маркер (выделяет его). Я хочу, чтобы расположить его над ним (2D), например:
Может быть от помощи x
и y
положения маркеров и использовать их на popupWindow.showAtLocation
. Но если у вас есть другие решения, я буду их слушать.
Задача 2: Когда я скольжу по карте, расположение сохраняется в центре экрана, но я хочу сохранить ее над маркером.
Примечание: Я не могу использовать mMap.setInfoWindowAdapter
, потому что я потеряю клик слушателей кнопки.
Это действительно хороший ответ. Единственная проблема заключается в том, что при перемещении карты всплывающее окно перемещается немного странно. Но я могу подумать, что нет способа сделать это лучше. Я собираюсь подождать немного, если кто-то опубликует лучший ответ, иначе я поставлю это как Accepted :) Большое спасибо! –
Упс, еще одна проблема: у меня есть несколько типов макетов для всплывающего окна. Они имеют разные размеры. Когда я пытаюсь использовать более крупный макет, я возвращаюсь к проблеме 1, описанной в вопросе (всплывающее окно появляется над маркером, скрывая его). –
добавил код, чтобы решить проблему сокрытия вашего ответа –