2021年3月4日木曜日

findViewByIdとrequireViewByIdの違い

Androidでレイアウトファイルに定義したViewのインスタンスを探すのに
findViewByIdを使ったことある人は多いと思う。
ViewのAPI仕様を見てたら、requireViewByIdという似たようなメソッドを発見したので、違いを書き残しておく。

違い

引数のIDを持つ子孫Viewを検索する。
ビューがない場合はnullを返す。
引数のIDを持つ子孫Viewを検索する。
ビューがない場合はIllegalArgumentExceptionを投げる。
つまり、IDに対応するViewが見つからない場合の挙動が異なるということ。

使い分け

基本的にrequireViewByIdで良いと思う。
これらのメソッドを使うときは、たいていレイアウトリソースを読み込んだ時だろう。
そうしたとき、静的定義されているViewが見つからないことはありえない。
なのにfindViewByIdを使用すると、静的解析等で「nullになる可能性があるから」とnullチェックを求められる。。
以上から、ViewをNonNullで返せるrequireViewByIdが優れていると思う。

もちろん、addViewやremoveViewを前提とした動的画面であれば、
Viewがいない状況もありえる為、「findViewById+nullチェック」戦法が良いだろう。

requireViewByIdの問題点を挙げるなら、APIが新しすぎるところ
API28からなので、Android9.0未満をサポートするなら使えない。


0 件のコメント:

コメントを投稿