web-dev-qa-db-ja.com

タッチモードとは何ですか?* ActivityTestRule *クラスにとってなぜ重要なのですか?

Android.support.test.rule.ActivityTestRuleクラス( ここ を参照)は、コンストラクターでinitialTouchModeパラメーターを取ります。これは、次の場合を除いて、クラスリファレンス(またはオンラインのどこでも)では説明されていません。

initialTouchMode-開始時にアクティビティを「タッチモード」にする必要がある場合はtrue

「タッチモード」とはどういう意味ですか?そして、initialTouchModeActivityTestRuletrueまたはfalseに設定することの意味は何ですか? (このパラメーターのデフォルト値はfalseであることがわかります)。

24
Adil Hussain

タッチモードは、ビューのフォーカスと選択の動作に影響します。

タッチモードは、電話とのユーザーインタラクションのみに依存するビュー階層の状態です。タッチモード自体は、最後のユーザー操作がタッチスクリーンで実行されたかどうかを示すだけなので、非常に理解しやすいものです。

.。

タッチモードでは、フォーカスも選択もありません。

http://Android-developers.blogspot.com/2008/12/touch-mode.html

14
yogurtearl

中程度の記事からの次の説明は、ActivityTestRuletouch 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

0
Jakaria Rabbi