6

Używam Google Maps Android API v2 z Androidem do wyświetlania aktualnej pozycji z pobliskimi znacznikami. Pobliskie miejsca, lokalizacje i tytuły, są odbierane za pomocą interfejsu Google Places API.Google Maps Android API v2, niewłaściwy tytuł/fragment znacznika

Problem polega na tym, że niepochodzące z języka angielskiego nazwy w tytule/urywku są wyświetlane w niepowodzeniu. Dla instancji, nazwy hebrajskie.

Dołączony jest ekran sFC.

Screenshot)

+0

Może okazać się, że mapy V2 nie ma odpowiedniego wsparcia RTL. Czy napotykasz problemy z językami LTR? – CommonsWare

+0

Pewnie, że nie, kolego. Wydaje się, że problem dotyczy tylko i18n. –

+0

Ponownie, moja teoria nie jest ogólnie dostępna w języku i18n, ale w językach RTL i LTR. Prawidłowa obsługa RTL jest stosunkowo nowa w systemie Android, a V2 w Mapach może go zepsuć.Możesz użyć 'InfoWindowAdapter' do stworzenia własnej zawartości balonu mapy, gdzie wykonasz lepszą pracę niż wbudowane elementy z RTL. – CommonsWare

Odpowiedz

12

Od arabski i hebrajski są przyczyną problemów, a angielski i rosyjski nie są, mam zamiar się domyślić, że coś jest zepsute w realizacji domyślne okno informacji w odniesieniu do prawej do lewej (RTL) Języki. Szczególnie, jeśli przeprowadzasz testy na Androidzie 4.2, może się zdarzyć, że domyślne okno okna Map V2 nieprawidłowo zastosowało różne atrybuty związane z RTL.

Na szczęście można podać własną zawartość okna informacyjnego, wprowadzając InfoWindowAdapter i zwracając numer getInfoContents()View, którego chcesz użyć w oknie informacyjnym.

Na przykład this sample project (od jutrzejszej aktualizacji do mojej książce) pokazuje dostosowywania okno informacyjne za pomocą tego InfoWindowAdapter:

class PopupAdapter implements InfoWindowAdapter { 
    LayoutInflater inflater=null; 

    PopupAdapter(LayoutInflater inflater) { 
    this.inflater=inflater; 
    } 

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

    @Override 
    public View getInfoContents(Marker marker) { 
    View popup=inflater.inflate(R.layout.popup, null); 

    TextView tv=(TextView)popup.findViewById(R.id.title); 

    tv.setText(marker.getTitle()); 
    tv=(TextView)popup.findViewById(R.id.snippet); 
    tv.setText(marker.getSnippet()); 

    return(popup); 
    } 
} 

Jeśli chcesz wymienić całe okno, trzeba getInfoWindow() zwrócić View. Jeśli dla zawartości okna zostanie użyty , zostanie użyty zwrot. Następnie załączasz instancję InfoWindowAdapter poprzez setInfoWindowAdapter() na swoim GoogleMap.

W twoim przypadku możesz użyć własnego układu, aby upewnić się, że poprawnie implementujesz RTL. To powinno w zasadzie wyjaśnić ten problem. Można sobie wyobrazić, że Maps V2 robi coś dziwnego, co łamie kod RTL, który normalnie powinien zadziałać, w takim przypadku musisz file an issue.

+1

ja tylko doda, że ​​w moim przypadku powinienem zrobić to, że sposób: \t \t \t @Override \t \t \t widok publiczny getInfoContents (marker marker) { \t \t \t \t Tex tView info = new TextView (ShareLocation.this); \t \t \t \t info.setLayoutParams (nowe FrameLayout.LayoutParams (FrameLayout.LayoutParams.MATCH_PARENT, \t \t \t \t \t \t FrameLayout.LayoutParams.MATCH_PARENT)); \t \t \t \t info.setText (marker.getTitle() + "\ n" + marker.getSnippet()); \t \t \t \t info.setTextColor (ShareLocation.this.getResources(). GetColor (R.color.black)); \t \t \t \t informacje zwrotne; \t \t } Działa pięknie. A głównym sekretem jest to, dlaczego google przegapił ten sposób :-) –

+0

@OlegPreobrazhenskyy, gdzie jesteś w stanie sprawić, że hebrajski działa? Próbuję z moim własnym układem za pomocą GetInfoWindow, a gdy angielski wygląda dobrze, hebrajski w TextView w ogóle nie jest widoczny ... Każda pomoc byłaby doceniana – Shushu

+0

@CommonsWare jest jakiś sposób na ustawienie ciągu utf8? (Arabic Lang) –

0

Dodajesz więcej informacji dotyczących CommnsWare odpowiedź:

od momentu Piszę to pochwalić, wydaje się, że sama mapa jest layout_direction="LTR" co oznacza, że ​​tytuły nie zostanie przerzucony na komputerach RTL. Rozwiązanie jest proste:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="wrap_content" 
android:layout_height="48dp" 
android:layoutDirection="locale" 
> 
    .... 
</RelativeLayout> 

Zwróć uwagę, że używam ustawienia układu lokalizacji, a nie dziedziczonego kierunku. Skomentowałem to w odpowiednim raporcie o błędzie Google tutaj: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5608#makechanges

+0

"layoutDirection" jest dostępny w API 17. Co by się stało wcześniej? Ponadto, myślę, że działa tylko podczas ustawiania textDirection dla textViews. –

0

Zauważyłem, że ten błąd występuje tylko na LinearLayout (co jest bardzo dziwne).

Spróbuj RelativeLayout zamiast, lub, jeśli masz API 17 i powyżej, ustawiony textDirection dla każdego z TextView i powinno działać

Powiązane problemy