2013-05-01 6 views
9

Я могу настроить содержание InfoWindow с простым блоком кода:Пользовательское InfoWindow с Google Maps API v2

private GoogleMap mMap; 
mMap.setInfoWindowAdapter(new InfoWindowAdapter() { 

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

     @Override 
     public View getInfoContents(Marker arg0) { 

      View v = getLayoutInflater().inflate(R.layout.custom_infowindow, null); 
      return v; 

     } 
    }); 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#55000000" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="HELLO" 
     android:textColor="#FF0000"/> 

</LinearLayout> 

Но это меняет только содержание, а не сама InfoWindow. Он по-прежнему остается белым с небольшой тенью на дне, и теперь красный текст HELLO отображается черным bg. Я хочу изменить этот defaultWindow по умолчанию на прозрачный черный прямоугольник. Как я могу это сделать?

enter image description here

+0

Возможно, это может привести где-то https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/GoogleMap.InfoWindowAdapter – alkis

+0

Этого должно быть достаточно http://wptrafficanalyzer.in/blog/customizing-infowindow-contents-in-google-map-android-api-v2-using-infowindowadapter /. Это полный учебник. – alkis

+0

@alkis это тот же учебник, который я использовал. Если вы присмотритесь к скриншоту, вы увидите, что это InfoWindow по умолчанию, но с пользовательским контентом – erdomester

ответ

1

Попробуйте это ... У меня есть немного изменить свой код.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
> 

    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#80000000" 
    > 

    <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="HELLO" 
    android:textColor="#FF0000" 
    android:padding="10dp"/> 

    </LinearLayout> 

</LinearLayout> 

Также это изменить ...

mMap.setInfoWindowAdapter(new InfoWindowAdapter() { 

     public View getInfoWindow(Marker arg0) { 
      View v = getLayoutInflater().inflate(R.layout.custom_infowindow, null); 
      return v; 
     } 

     public View getInfoContents(Marker arg0) { 

      //View v = getLayoutInflater().inflate(R.layout.custom_infowindow, null); 

      return null; 

     } 
    }); 

Я надеюсь, что это будет работать ... :)

+0

Нет, это не делает. – erdomester

+0

@ erdomester-мой код будет отображать прозрачный черный прямоугольник. У меня есть тест. Вы проверили? – TheFlash

+0

Конечно, я протестировал его. Я даже удалил все стили из styles.xml. – erdomester

10

enter image description here

использовать этот путь ...

myMap.setInfoWindowAdapter(new InfoWindowAdapter() { 

       @Override 
       public View getInfoWindow(Marker arg0) { 

        ContextThemeWrapper cw = new ContextThemeWrapper(
          getApplicationContext(), R.style.Transparent); 
        // AlertDialog.Builder b = new AlertDialog.Builder(cw); 
        LayoutInflater inflater = (LayoutInflater) cw 
          .getSystemService(LAYOUT_INFLATER_SERVICE); 
        View layout = inflater.inflate(R.layout.custom_infowindow, 
          null); 
        return layout; 
       } 

       @Override 
       public View getInfoContents(Marker arg0) { 

        return null; 

       } 
      }); 

R.style.Transparen т добавить это в style.xml

<style name="Transparent" parent="android:Theme.Light"> 
     <item name="android:windowIsTranslucent">true</item> 
     <item name="android:windowBackground">@android:color/transparent</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:windowNoTitle">true</item> 
     <item name="android:windowIsFloating">true</item> 
     <item name="android:backgroundDimEnabled">false</item> 
    </style> 

    <color name="transparent">#00000000</color> 

Отредактировано:

custom_infowindow.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#FF0000" 
     android:text="HELLO" /> 

</LinearLayout> 
+0

Это не изменяет звучание. Я получаю тот же результат, что и раньше. Тем не менее, я вижу, он работает для вас. Я удалил все стили, но напрасно ... – erdomester

+0

@erdomester: я добавил custom_infowindow.xml в моем ответе .. просто используйте весь мой собственный код ... и скажите мне, что он работает или нет. –

+0

Я по-прежнему получаю макет по умолчанию с красным HELLO: http://www.2shared.com/photo/ lBOzOHMz/hello.html Я тестирую на 2.3.5 – erdomester

34

вы должны написать свой код в методе getInfoWindow. поэтому вы можете настроить информационное окно. , например.

@Override 
public View getInfoWindow(Marker marker) { 

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

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

    TextView address = (TextView) v.findViewById(R.id.distance); 
    address.setText(marker.getSnippet()); 

    return v; 
} 

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

Правильный ответ: используйте getInfoWindow, чтобы не использовать стандартную белую рамку. – jb15613

+0

Вам нужно установить значениеInfoWindowAdapter() сразу после метода map.addMarker(), чтобы он вступил в силу. Не вызывайте setInfoWindowAdapter() в onMarkerClick(). –

+0

Я бы рекомендовал раздуть представление перед вызовом функции и только изменить соответствующую информацию при вызове getInfoWindow() –

1

Вы должны setInfoWindowAdapter() метод сразу после map.addMarker() для того чтобы этот эффект. Не вызывайте setInfoWindowAdapter() в onMarkerClick().

Смежные вопросы