2011-02-11 31 views
24

Tôi có một ứng dụng Android có chuỗi tiếng Anh trong các giá trị/strings.xml. Đối với mỗi chuỗi trong tệp đó, tôi có một mục nhập trong các giá trị-ja/strings.xml với bản dịch tiếng Nhật của chuỗi đó. Nếu tôi đặt trình mô phỏng, Nexus One hoặc Nexus S sang tiếng Nhật, giao diện người dùng sẽ hiển thị văn bản tiếng Nhật trong suốt. Hầu hết thời gian.Tại sao có thể Resources.getString() liên tục trả về các chuỗi từ vị trí sai?

Đôi khi, một số phần của giao diện người dùng sẽ xuất hiện bằng tiếng Anh, mặc dù ngôn ngữ hiện tại là ja-JP. Ví dụ, tôi đã viết mã kiểm tra này trong phương thức onCreate() của một trong những hoạt động của tôi:

Log.e(TAG, "Default locale = '" + Locale.getDefault().toString() + "'"); 
Log.e(TAG, "My string = '" + getResources().getString(R.string.my_string) + "'"); 

Đôi khi tôi sẽ nhìn thấy trong LogCat:

Default locale is 'ja_JP' 
My string is '日本' 

lần khác, tôi sẽ thấy:

Default locale is 'ja_JP' 
My string is 'English' 

Đôi khi vấn đề này được giải quyết bằng cách xoay điện thoại. Đôi khi nó được giải quyết bằng cách thoát và khởi động lại ứng dụng. Đôi khi chỉ một phần của một màn hình duy nhất là tiếng Anh. Đôi khi vấn đề này xảy ra với các chuỗi được rút ra khỏi các tài nguyên thông qua mã, và đôi khi nó xảy ra với các chuỗi chỉ được tham chiếu bởi một bố trí. Không nơi nào trong ứng dụng của tôi, tôi gọi Locale.setDefault(), vì vậy điều đó không gây ra vấn đề.

CẬP NHẬT

Tôi đã tìm thấy một cách để sửa vấn đề cho một hoạt động cụ thể. Trong onCreate của hoạt động():

Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'"); 
Log.e(TAG, "getResources().getConfiguration(): '" + 
     getResources().getConfiguration().toString() + "'"); 
Log.e(TAG, "getResources().getDisplayMetrics(): '" + 
     getResources().getDisplayMetrics().toString() + "'"); 

Log.e(TAG, "Setting configuration to getConfiguration()"); 
getResources().updateConfiguration(getResources().getConfiguration(), 
    getResources().getDisplayMetrics()); 

Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'"); 
Log.e(TAG, "getResources().getConfiguration(): '" + 
     getResources().getConfiguration().toString() + "'"); 
Log.e(TAG, "getResources().getDisplayMetrics(): '" + 
     getResources().getDisplayMetrics().toString() + "'"); 

Điều này dẫn đến sau trong LogCat:

getString: 'English' 
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}' 
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}' 
Setting configuration to getConfiguration() 
getString: '日本' 
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}' 
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}' 

Như bạn có thể nhìn thấy từ nhật ký, không có gì trong những thay đổi cấu hình hiện tại, nhưng getString() cung cấp khác nhau các kết quả. Việc sử dụng giải pháp này ở mọi nơi trong ứng dụng của tôi có thể sử dụng tài nguyên, nhưng hy vọng điều này sẽ cung cấp gợi ý về những gì đang xảy ra. Điều này là không thực tế.

+0

Bạn đã thử trình theo dõi lỗi google android? http://code.google.com/p/android/issues/ –

+0

bạn đang sử dụng phiên bản AVD nào? – rockeye

+0

Tôi đã xem xét mọi lỗi trong trình theo dõi lỗi chứa "ngôn ngữ" hoặc "ngôn ngữ". Tôi không thấy ai khác báo cáo vấn đề này. –

Trả lời

0

Bạn có đang thay đổi Ngôn ngữ khi ứng dụng đang chạy không? Nếu có, bạn đã triển khai đúng các yếu tố khác nhau của vòng đời Hoạt động (bao gồm onSaveInstanceState()onRestoreInstanceState())?

Theo http://developer.android.com/guide/topics/resources/runtime-changes.html, thay đổi cấu hình trong thời gian chạy sẽ khiến Hoạt động bị hủy & được khởi động lại. Có vẻ như ứng dụng của bạn đang nhận thấy cấu hình mới nhưng không khởi động lại đúng cách (cho đến khi khởi động lại toàn bộ Ứng dụng hoặc thay đổi hướng).

Bạn đang làm điều gì đó sôi nổi trong onSaveInstanceState hoặc onDestroy?

P.s. Nếu nó tự sửa chữa chỉ trên những thay đổi định hướng nhất định, bạn có thể tư vấn nếu những thay đổi định hướng đó xảy ra trên bố cục có các tệp bố cục ngang khác nhau theo chiều dọc & không?

+0

Tôi cũng lo ngại về vòng đời hoạt động. Tôi đặt các câu lệnh Log.e() vào mỗi onCreate() và onDestroy(). Khi bạn thay đổi ngôn ngữ trong cài đặt, hệ điều hành sẽ tự động hủy và tạo lại các hoạt động của bạn. Không có triển khai onSaveInstanceState() nào của chúng tôi làm bất cứ điều gì ngoại trừ một việc lưu tệp nhật ký cục bộ. –

+0

Nói về vòng đời, ứng dụng chứa cả mã gốc và dịch vụ nền. Tôi không tin rằng những điều này sẽ ảnh hưởng đến các nguồn lực, mặc dù. –

+0

Ứng dụng không khai báo bất kỳ mệnh đề android: configChanges nào trong AndroidManifest.xml, do đó việc xử lý các thay đổi cấu hình là tự động. Ứng dụng không có tệp bố cục khác nhau cho các định hướng khác nhau. –

1

Đây chỉ là một lý thuyết nhưng you could be leaking a Context. Về cơ bản, hoạt động cũ có thể báo cáo giá trị chuỗi chứ không phải là giá trị mới được tạo.

Một cách để kiểm tra điều này là: (! KHÔNG TĨNH)

  1. Thay đổi TAG cho một biến thành viên.
  2. OnCreate, đặt TAG = this.toString(), điều này sẽ đặt địa chỉ bộ nhớ của hoạt động dưới dạng thẻ.
  3. Cho phép hoạt động in ra nội dung bằng ngôn ngữ ban đầu.
  4. Làm bất cứ điều gì để thay đổi ngôn ngữ. Điều này nên (không bao giờ xác minh điều này) khởi động lại hoạt động và bạn sẽ có được một hoạt động mới. Nếu bạn làm. Sau đó nhìn vào nhật ký và xem liệu địa chỉ bộ nhớ có thay đổi cho thẻ không. Nếu địa chỉ bộ nhớ giống như trước khi ngữ cảnh bị rò rỉ.
+0

Tôi đã thử một phương pháp hơi khác: tôi đặt điểm ngắt trên lệnh gọi getString() trong phương thức onCreate() của một Hoạt động. Tôi nhìn vào giá trị của điều này, đó là Hoạt động (cũng là ngữ cảnh). Nó khác nhau mỗi lần. Tôi không nghĩ rằng đây là nguyên nhân của vấn đề. –

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