StackOverflowを掘り下げて、同様の問題に対する回答を探します。通常、2つのアプローチを提案している人がいます。
- ドローアブルをメモリにロードし、ConstantStateまたはビットマップ自体を他のものと比較します。
- ドローアブルIDのタグをビューに設定し、必要に応じてタグを比較します。
個人的には、パフォーマンス上の理由から2番目のアプローチが好きですが、一連のビューに適切なタグを付けるのは面倒で時間がかかります。これは、大きなプロジェクトでは非常にイライラする可能性があります。私の場合、TextView
ドローアブル、ImageView
リソース、View
バックグラウンド、フォアグラウンドを比較する必要がある多くのEspressoテストを作成する必要があります。多くの作業。
そこで私は最終的に、「汚い」作業をカスタムインフレーターに委任するための解決策を思いつきました。膨らんだすべてのビューで、特定の属性を検索し、リソースIDが見つかった場合は、そのビューにタグを設定します。このアプローチは、書道の人たちが使用したものとほとんど同じです。そのための簡単なライブラリを作成しました:TagView
これを使用すると、xmlレイアウトファイルで設定された描画可能なリソースIDを含む、事前定義されたタグを取得できます。
TagViewUtils.getTag(view, ViewTag.IMAGEVIEW_SRC.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_LEFT.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_TOP.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_RIGHT.id)
TagViewUtils.getTag(view, ViewTag.TEXTVIEW_DRAWABLE_BOTTOM.id)
TagViewUtils.getTag(view, ViewTag.VIEW_BACKGROUND.id)
TagViewUtils.getTag(view, ViewTag.VIEW_FOREGROUND.id)
ライブラリは、実際にはすべての属性をサポートしています。手動で追加できます。Githubの[カスタム属性]セクションを確認するだけです。実行時にドローアブルを設定すると、便利なライブラリメソッドを使用できます。
setImageViewResource(ImageView view, int id)
この場合、タグ付けは内部で行われます。Kotlinを使用する場合は、view自体を呼び出すための便利な拡張機能を作成できます。このようなもの:
fun ImageView.setImageResourceWithTag(@DrawableRes int id) {
TagViewUtils.setImageViewResource(this, id)
}
実行時のタグ付けで追加情報を見つけることができます