今日、コードを整理しているところですが、コードに中国語がハードコーディングされていることがわかり、不安になりました。同僚のコーディングレベルが心配です。
忘れて、自分で変更し、対応するディレクトリのstrings.xmlで中国語と英語の文字列を定義してから、Contextを使用してアクセスすることを計画してください。
初めに私はこれを書いた:
Context mContext = InstrumentationRegistry.getContext();
String portableHotspot = mContext.getString(R.string.portable_hotspot);
その結果、例外がスローされました。
android.content.res.Resources$NotFoundException: String resource ID #0x7f0b0024
at android.content.res.Resources.getText(Resources.java:410)
at android.content.res.HwResources.getText(HwResources.java:465)
at android.content.res.Resources.getString(Resources.java:504)
at android.content.Context.getString(Context.java:560)
at com.example.termctrl.functions.HotpotControl.<init>(HotpotControl.java:51)
at com.example.termctrl.UiAutoController.testHotpotControl(UiAutoController.java:778)
at java.lang.reflect.Method.invoke(Native Method)
長い間インターネットをチェックした後、私はこのリンクを見つけるまで理由を見つけませんでした:
https://stackoverflow.com/questions/17713226/accessing-resources-for-android-ui-automator-tests
コンテキストの使用法を変更します。
Context mContext = InstrumentationRegistry.getTargetContext();
ここではgetTargetContextが使用されていることに注意してください。クリックして、ソースコードを確認してください。
public Context getTargetContext() {
return mAppContext;
}
返された名前から、それはアプリのコンテキストです。まあ、それについて考えた後、それは合理的であるはずです。getContextのソースコード:
public Context getContext() {
return mInstrContext;
}
名前から判断すると、Instrumentation Contextの略であるはずですが、正しくないようです。リソースにアクセスしたい場合は、もちろんアプリケーションリソースにアクセスする必要があります。それが理由のようです。そこで私は、mAppContextがどのように割り当てられているかを確認しました。
final void init(ActivityThread thread,
Context instrContext, Context appContext, ComponentName component,
IInstrumentationWatcher watcher, IUiAutomationConnection
uiAutomationConnection) {
mThread = thread;
mMessageQueue = mThread.getLooper().myQueue();
mInstrContext = instrContext;
mAppContext = appContext;
mComponent = component;
mWatcher = watcher;
mUiAutomationConnection = uiAutomationConnection;
}
値はinit初期化関数で割り当てられ、appContextは渡されたパラメーターであり、アプリケーションコンテキストなどのアプリケーション独自のコンテキストである必要があります。
この問題は非常に単純なようで、単純ではないようです。UIAutomatorを初めて使用してStringリソースにアクセスするときは、拡張して他のリソースにアクセスできます。要約は次のとおりです。