Невозможно установить пользовательские информационные окна Google Maps

Я пытаюсь установить Custom info windows, используя этот руководство.

Вот мой код:

public class MyActivity extends AppCompatActivity implements OnMapReadyCallback, ClickListenerChatFirebase, GoogleMap.InfoWindowAdapter {

public void showMap() {
        venueMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(venueLat), Double.parseDouble(venueLng))).title(venue.trim()));
        venueMarker.showInfoWindow();
        getInfoWindow(venueMarker);
    }

public AcceptedRequest(LayoutInflater inflater){
        this.inflater = inflater;
    }

    @Override
    public View getInfoWindow(Marker marker) {

        // Getting view from the layout file
//        inflater = getLayoutInflater();
        View v = inflater.inflate(R.layout.venue_infowindow_background, null);

        TextView title = (TextView) v.findViewById(R.id.venue_txt);
        title.setText(marker.getTitle());

        return v;
    }

    @Override
    public View getInfoContents(Marker arg0) {
        // TODO Auto-generated method stub
        return null;
    }

}

}

Вот venue_infowindow_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="horizontal"
              android:background="@color/colorPrimary"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

    <TextView
        android:id="@+id/venue_txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="venue"
        android:textSize="14sp"
        android:textStyle="bold"
        android:textColor="@android:color/white"/>

</LinearLayout>

Проблема в том, что никаких изменений не происходит, а в информационном окне отображаются цвета текста и фона по умолчанию.

Пожалуйста, помогите с этой проблемой.


person Hammad Nasir    schedule 12.01.2017    source источник


Ответы (1)


Вы не можете просто напрямую вызвать переопределение метода getInfoWindow().

Вам нужно установить InfoWindowAdapter для карты Google в свою активность, которая реализует интерфейс GoogleMap.InfoWindowAdapter.

public void showMap() {
    venueMarker = mMap.addMarker(new MarkerOptions().position(new LatLng(Double.parseDouble(venueLat), Double.parseDouble(venueLng))).title(venue.trim()));
    venueMarker.showInfoWindow();

    //This won't work:
    //getInfoWindow(venueMarker); 

    //Do this instead:
    mMap.setInfoWindowAdapter(this);
}

Чтобы использовать другой макет для этого маркера, вы можете создать другой пользовательский макет для всех остальных маркеров:

@Override
public View getInfoWindow(Marker marker) {
    View v = null;
    if (marker.equals(venueMarker)) {
        v = inflater.inflate(R.layout.venue_infowindow_background, null);
    } else {
        v = inflater.inflate(R.layout.some_other_layout, null);
    }

    TextView title = (TextView) v.findViewById(R.id.venue_txt);
    title.setText(marker.getTitle());

    return v;
}

Чтобы использовать «облачко речи» с маркерами по умолчанию, а не с одним пользовательским маркером, вы можете использовать getInfoWindow() с пользовательским маркером и getInfoContents() для маркеров по умолчанию. (Подробнее здесь). Что-то вроде этого может сработать.:

@Override
public View getInfoWindow(Marker marker) {
    if (!marker.equals(venueMarker)) {
        return null;
    }
    View v = inflater.inflate(R.layout.venue_infowindow_background, null);
    TextView title = (TextView) v.findViewById(R.id.venue_txt);
    title.setText(marker.getTitle());

    return v;
}

@Override
public View getInfoContents(Marker arg0) {
    if (marker.equals(venueMarker)) {
        return null;
    }
    View v = inflater.inflate(R.layout.some_other_layout, null);
    TextView title = (TextView) v.findViewById(R.id.venue_txt);
    title.setText(marker.getTitle());

    return v;
}
person Daniel Nugent    schedule 12.01.2017
comment
это сработало, но изменило фон и цвет текста всех маркеров ... как я могу изменить его для 1 конкретного маркера? - person Hammad Nasir; 12.01.2017
comment
Вы можете реализовать переопределение getInfoWindow() таким образом, чтобы оно увеличивало один макет для одного маркера и другой макет для всех остальных маркеров. - person Daniel Nugent; 12.01.2017
comment
но как? пожалуйста, уточните немного. - person Hammad Nasir; 13.01.2017
comment
Я обновил ответ, взгляните на второй блок кода. Если вы хотите, чтобы другие маркеры выглядели как стандартные, просто задайте some_other_layout.xml белый фон и черный текст. - person Daniel Nugent; 13.01.2017
comment
Большой! Это сработало, но как мне сделать такое же информационное окно, как окно по умолчанию? Как с этой направленной вниз частью прямо над маркером? - person Hammad Nasir; 13.01.2017
comment
Я только что обновил ответ чем-то, что может сработать. Хотя я не проверял! - person Daniel Nugent; 13.01.2017
comment
это сработало, но я получаю странное дополнение, как показано здесь: stackoverflow.com/questions/18282718/ Как это удалить? Есть идеи? - person Hammad Nasir; 13.01.2017
comment
Я только что снова обновил ответ, изначально у меня была неправильная логика относительно того, когда использовать речевой пузырь. Взгляните на последний код. - person Daniel Nugent; 13.01.2017
comment
да, но странная прокладка все еще там... теперь это проблема :| - person Hammad Nasir; 13.01.2017
comment
любое решение относительно странного заполнения? - person Hammad Nasir; 13.01.2017
comment
@HammadNasir Нет простого решения. По сути, если вы используете белый речевой пузырь по умолчанию, вам нужно будет использовать светлый фон. Для темного фонового речевого пузыря вам нужно будет сделать собственный. По сути, используйте getInfoWindow(), а в макете xml определите пользовательский рисунок как фон, который имеет форму речевого пузыря (вы можете использовать рисунки png или xml). Возможно, вам придется использовать Photoshop для создания пользовательских ресурсов png, если вы не можете найти ничего готового. - person Daniel Nugent; 13.01.2017