コンテキストを使用してUIAutomatorの文字列リソースにアクセスする方法

今日、コードを整理しているところですが、コードに中国語がハードコーディングされていることがわかり、不安になりました。同僚のコーディングレベルが心配です。

忘れて、自分で変更し、対応するディレクトリの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リソースにアクセスするときは、拡張して他のリソースにアクセスできます。要約は次のとおりです。

おすすめ

転載: blog.csdn.net/Xia_Leon/article/details/83017844