前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

AppBarLayout内のViewのVisibilityを変更したらlayout_scrollFlags="snap" が無視された話

タイトルがイケてないが他に短い表現も思いつかなかったのでとりあえず。

課題

AppBarLayout内に3つのViewを配置。それぞれのapp:layout_scrollFlagsは上から順に以下の通り

  1. app:layout_scrollFlags="scroll"
  2. app:layout_scrollFlags="scroll"
  3. app:layout_scrollFlags="snap"

AppBarLayoutの下にはRecyclerViewがあり、スクロールさせるとAppBarLayoutの一番したが残る仕組み。 あるボタンが押下された時点で2番目のViewのVisibilityをGoneにしたら3番目のViewのsnapが効かなくなり、 スクロールするようになった。

対応

Visibilityの切替えはうまくいかなかったので回避策を取ることにした。

    @BindView(R.id.second_view)
    lateinit var secondView: View

     //secondViewを非表示
    appBar.removeView(secondView)


    //secondViewを表示
    if (secondView.parent == null) {
            appBar.addView(secondView, 1)
    }

本来はvisibilityの変更とaddViewの場合の内部処理の違いを見つつ 対応したいところだがとりあえずこれで回避は可能。 バージョンやViewの内容によっても挙動は異なるのではないかと思う。