6

Tôi sử dụng API Android của Google Maps phiên bản v2 với Android để hiển thị vị trí hiện tại với các điểm đánh dấu lân cận. Vị trí và tiêu đề địa điểm lân cận được nhận bằng API Google Địa điểm.API Google Maps Android v2, Hiển thị lỗi tiêu đề/đoạn trích hiển thị sai

Sự cố là tên không phải tiếng Anh tại tiêu đề/đoạn mã được hiển thị theo cách không thành công. Ví dụ, tên tiếng Do Thái.

Ảnh chụp màn hình được đính kèm.

Screenshot)

+0

Nó có thể là Maps V2 không có hỗ trợ RTL thích hợp. Bạn có gặp vấn đề với ngôn ngữ LTR không? – CommonsWare

+0

Chắc chắn tôi không phải là bạn đời. Dường như vấn đề chỉ áp dụng cho i18n. –

+0

Một lần nữa, lý thuyết của tôi không phải là i18n nói chung, mà là ngôn ngữ RTL và LTR. Hỗ trợ RTL phù hợp tương đối mới trong Android và Maps V2 có thể đã làm hỏng nó.Bạn có thể sử dụng 'InfoWindowAdapter' để tạo nội dung của riêng bạn trên khinh khí cầu bản đồ, nơi bạn làm tốt hơn công cụ tích hợp với RTL. – CommonsWare

Trả lời

12

Kể từ tiếng Ả Rập và tiếng Hebrew đang gây ra vấn đề, và tiếng Anh và tiếng Nga thì không, tôi sẽ đoán rằng một cái gì đó bị phá vỡ trong việc thực hiện cửa sổ thông tin mặc định liên quan đến RTL từ phải sang trái () ngôn ngữ. Đặc biệt nếu bạn đang chạy thử nghiệm trên Android 4.2, có thể là nội dung cửa sổ thông tin mặc định của Maps V2 đã áp dụng sai các thuộc tính liên quan đến RTL khác nhau.

May mắn thay, bạn có thể cung cấp nội dung cửa sổ thông tin của riêng mình bằng cách triển khai InfoWindowAdapter và có getInfoContents() trả lại View mà bạn muốn sử dụng trong cửa sổ thông tin.

Ví dụ, this sample project (từ bản cập nhật vào ngày mai để cuốn sách của tôi) cho thấy tùy biến cửa sổ thông tin sử dụng này 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); 
    } 
} 

Nếu bạn muốn thay thế toàn bộ cửa sổ, bạn sẽ phải getInfoWindow() trả về một View. Nếu getInfoWindow() trả về null, getInfoContents() được sử dụng cho nội dung của cửa sổ. Sau đó, bạn đính kèm một phiên bản của InfoWindowAdapter qua setInfoWindowAdapter() trên số GoogleMap của mình.

Trong trường hợp của bạn, bạn có thể sử dụng bố cục của riêng mình để đảm bảo rằng bạn đang triển khai RTL chính xác. Đó là, về nguyên tắc, làm sáng tỏ vấn đề này. Có thể hiểu rằng Maps V2 thực hiện điều gì đó kỳ lạ để phá vỡ mã RTL mà thông thường sẽ hoạt động, trong trường hợp này bạn cần phải file an issue.

+1

tôi chỉ sẽ thêm rằng trong trường hợp của tôi, tôi nên làm điều này theo cách: \t \t \t @ Override \t \t \t công khai Xem getInfoContents (marker marker) { \t \t \t \t Tex tView info = new TextView (ShareLocation.this); \t \t \t \t info.setLayoutParams (FrameLayout.LayoutParams mới (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 thông tin trả lại; \t \t \t} Hoạt động đẹp. Và bí mật chính là lý do tại sao google bỏ lỡ cách này :-) –

+0

@OlegPreobrazhenskyy, nơi bạn có thể làm cho tiếng Do Thái hoạt động? Tôi đang cố gắng với cách bố trí của riêng tôi bằng cách sử dụng GetInfoWindow, và trong khi tiếng Anh trông ok, Hebrew trong TextView là không nhìn thấy ở tất cả ... Bất kỳ trợ giúp sẽ được đánh giá cao – Shushu

+0

@CommonsWare là có một cách để thiết lập một chuỗi utf8? (Arabic Lang) –

0

Thêm biết thêm về CommnsWare câu trả lời:

Tính đến thời điểm tôi viết khen thưởng này, có vẻ như bản đồ chính nó là layout_direction="LTR" có nghĩa là tiêu đề của bạn sẽ không được lộn trên máy tính để bàn RTL. Giải pháp rất đơn giản:

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

Lưu ý rằng tôi đang sử dụng hướng bố cục của ngôn ngữ chứ không phải hướng được kế thừa. Tôi đã nhận xét điều này trên báo cáo lỗi tương ứng của Google tại đây: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5608#makechanges

+0

"layoutDirection" có sẵn từ API 17. Điều gì sẽ xảy ra trước đây? Ngoài ra, tôi nghĩ nó chỉ hoạt động khi thiết lập textDirection cho textViews. –

0

Tôi đã nhận thấy rằng lỗi này chỉ xảy ra trên LinearLayout (rất lạ).

Hãy thử RelativeLayout thay vào đó, hoặc, nếu bạn có API 17 trở lên, thiết textDirection cho mỗi TextView, và nó sẽ làm việc

Các vấn đề liên quan