29

values/strings.xml に英語の文字列を含む Android アプリケーションがあります。そのファイル内の各文字列について、values-ja/strings.xml にその文字列の日本語訳を含むエントリがあります。エミュレーター、Nexus One または Nexus S を日本語に設定すると、UI 全体に日本語のテキストが表示されます。ほとんどの時間。

現在のロケールが ja-JP であっても、UI の一部が英語で表示されることがあります。たとえば、アクティビティの 1 つの onCreate() メソッドに次のテスト コードを記述しました。

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

ときどき LogCat に次のように表示されます。

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

また、次のように表示されます。

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

この問題は、電話を回転させることで解決される場合があります。アプリを終了して再起動することで解決する場合があります。場合によっては、1 つの画面の一部だけが英語で表示されます。この問題は、コードを介してリソースから引き出された文字列で発生することもあれば、レイアウトによってのみ参照される文字列で発生することもあります。アプリケーションのどこにも Locale.setDefault() を呼び出していないため、問題は発生していません。

アップデート

特定のアクティビティの問題を修正する方法を見つけました。そのアクティビティの onCreate() で:

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() + "'");

これにより、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}'

ログからわかるように、現在の構成は何も変更されていませんが、getString() では異なる結果が得られます。

アプリケーション内のリソースが使用される可能性のあるすべての場所でこの回避策を使用するのは現実的ではありませんが、問題の原因についてのヒントが得られることを願っています。

4

3 に答える 3

1

これは単なる理論ですが、コンテキストをリークしている可能性があります。基本的に、古いアクティビティは、新しく作成されたものではなく、文字列値を報告している可能性があります。

これをテストする方法は次のとおりです。

  1. TAG をメンバー変数に変更します (静的ではありません!)。
  2. OnCreate で、TAG = this.toString() を設定します。これにより、アクティビティのメモリ アドレスがタグとして配置されます。
  3. 初期ロケールを使用して、アクティビティに印刷物を出力させます。
  4. ロケールを変更するために何でもします。これにより(これを確認したことはありません)アクティビティが再開され、新しいアクティビティが取得されます。もしあなたがそうするなら。次に、ログを見て、タグのメモリ アドレスが変更されているかどうかを確認します。メモリ アドレスがコンテキストがリークされる前と同じ場合。
于 2011-04-23T07:08:58.713 に答える
0

アプリケーションの実行中にロケールを変更しますか?もしそうなら、あなたはアクティビティライフサイクルのさまざまな要素(onSaveInstanceState()とを含むonRestoreInstanceState())を適切に実装しましたか?

http://developer.android.com/guide/topics/resources/runtime-changes.htmlによると、実行時に構成を変更すると、アクティビティが破棄されて再起動されるはずです。アプリは新しい構成に気付いているようですが、正しく再起動していません(アプリ全体を再起動するか、向きを変更するまで)。

ファンキーなことをしているのですonSaveInstanceStateonDestroy

Ps特定の向きの変更でのみ修正される場合、それらの向きの変更が、垂直方向と水平方向のレイアウトファイルが異なるレイアウトで発生するかどうかをアドバイスできますか?

于 2011-02-14T20:48:24.760 に答える