Android.support.test.rule.ActivityTestRule
クラス( ここ を参照)は、コンストラクターでinitialTouchMode
パラメーターを取ります。これは、次の場合を除いて、クラスリファレンス(またはオンラインのどこでも)では説明されていません。
initialTouchMode-開始時にアクティビティを「タッチモード」にする必要がある場合はtrue
「タッチモード」とはどういう意味ですか?そして、initialTouchMode
のActivityTestRule
をtrue
またはfalse
に設定することの意味は何ですか? (このパラメーターのデフォルト値はfalse
であることがわかります)。
タッチモードは、ビューのフォーカスと選択の動作に影響します。
タッチモードは、電話とのユーザーインタラクションのみに依存するビュー階層の状態です。タッチモード自体は、最後のユーザー操作がタッチスクリーンで実行されたかどうかを示すだけなので、非常に理解しやすいものです。
.。
タッチモードでは、フォーカスも選択もありません。
http://Android-developers.blogspot.com/2008/12/touch-mode.html
中程度の記事からの次の説明は、ActivityTestRule
のtouch mode
を理解するのに優れていると思います。
「タッチモードでは、フォーカスも選択もありません。」
つまり、指が画面に触れても副作用は発生しません。たとえば、ビューはフォーカスを維持しません。タッチ不可能なプラットフォームでのAndroid OSの動作を思い出すまで、意味がありません。 「タッチモード」で動作しない最新の最良の例は、AndroidTVです。十字キーコントロールを使用すると、ビューを選択またはフォーカスすることができ、ビューがフォーカスされるとすぐにクリックを実行できます。
RecyclerViewとタッチモードに注意してください!
view
内のRecyclerView
に対してclick action
を実行するとします。
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.someAction)), click()))
間違えてタッチモードを無効にしてテスト中の
Activity
を起動しない限り、コードは簡単です。
val initialTouchMode = false
val launchActivity = true
@JvmField @Rule var activityRule = ActivityTestRule(
MainActivity::class.Java, initialTouchMode, launchActivity
)
最終的には、基になるクリックリスナーが起動されず、ハッキングして
click
を繰り返す必要があります。
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.someAction)), click()))
.perform(RecyclerViewActions.actionOnItem(
hasDescendant(withId(R.id.someAction)), click()))
この謎への答えは、XMLを介してインフレートされたRecyclerViewが構築フェーズ中にsetFocusableInTouchMode(true)を持つという事実です。ページ全体が非タッチモードで起動され、最初のクリックがフォーカスイベントとして解釈され、他のすべてのクリックはタッチモードで予想されるように解釈されます。修正は、
touch mode
を有効にしてアクティビティを起動するのと同じくらい簡単です。
val initialTouchMode = true
val launchActivity = true
@JvmField @Rule var activityRule = ActivityTestRule(
MainActivity::class.Java, initialTouchMode, launchActivity
)
外植はこのリンクで見つけることができます: https://medium.com/@tom.koptel/espresso-initialtouchmode-can-shoot-you-in-the-leg-85c5f922754