FlexboxLayoutによる柔軟なレイアウトの構築


昨年のGoogle I/O大会で、GoogleはConstraintLayoutを発表しました.彼は私たちに平面的なビュー階層を使って複雑なインタフェースレイアウトを構築することができます.Android studioのビューエディタも完全にサポートされています.
同時に、GoogleはFlexboxLayoutをオープンソースし、CSS Flexibleレイアウトモジュールと同じ機能を持っています.次の例では、FlexboxLayoutを使用していくつかの特殊な機能を実現します.
FlexboxLayoutを高度なLinearLayoutと理解することができます.彼はLinearLayoutと同じように水平と垂直方向にサブviewを順番に配置しています.彼とLinearLayoutの最大の違いは、FlexboxLayoutにwrapping機能があることです.flexWrap="wrap"プロパティを追加すると、現在の方向に新しいサブviewを配置するのに十分なスペースがない場合は、新しい行にサブviewを配置します.
同じレイアウトで複数のスクリーンサイズを合わせる
水平方向に順次viewを配置したいのですが、有効な空間が変化した場合(異なる携帯電話機器、携帯電話の方向が変化した場合、マルチウィンドウモードによるインタフェースの再描画など)は、新しい行に空きスペースのないviewを配置し続けたいと思っています.
LinearLayout、RelativeLayoutなどの従来のレイアウトを使用してこの機能を実現する場合は、複数のDP-bucketレイアウト(layout-600 dp、layout-720 dp、layout-1020 dp)を定義してマルチスクリーンサイズの問題を処理する必要があります.ただし、上のダイアログボックスではFlexboxLayoutが1つしか使用されていません.
この例では、前述のflexWrap="wrap"プロパティを使用します.
.support.design.widget.TextInputLayout
     android:layout_width="100dp"
     android:layout_height="wrap_content" 
     app:layout_flexgrow="1">
     ......

Githubから完全なレイアウトファイルを入手できます
RecyclerViewとの併用
FlexboxLayoutのもう一つの利点は、RecyclerViewと組み合わせて使用できることです.最新リリースのalphaバージョンでは、RecyclerViewレイアウトマネージャFlexboxLayoutManagerがRecyclerViewから継承しています.LayoutManagerでは、メモリをより効率的に利用することで、スクロールコンテナでFlexbox機能を実現できます.もちろん、ScrollViewとFlexboxLayoutを組み合わせて、スクロール可能なコンテナでFlexbox機能を実現することもできますが、コンテナ内のサブviewの数が多い場合、OutOfMemoryErrorの発生を招きます.実際には、GoogleのPhotosアプリやニュースアプリなど、FlexboxLayoutとRecyclerViewを組み合わせて使用できるシーンがたくさんあります.この2つのアプリケーションは、幅の異なる画像を大量に表示する必要があります.
次の例では、RecyclerViewに表示される画像ごとに幅が異なり、flexWrapの値をwrapに設定します.
FlexboxLayoutManager layoutManager = new FlexboxLayoutManager();
layoutManager.setFlexWrap(FlexWrap.WRAP);

次にflexGrowの値を設定します(これによりitemごとにflexGrow値を順次設定する必要がなくなります).
void bindTo(Drawable drawable) {
  mImageView.setImageDrawable(drawable);
  ViewGroup.LayoutParams lp = mImageView.getLayoutParams();
  if (lp instanceof FlexboxLayoutManager.LayoutParams) {
    FlexboxLayoutManager.LayoutParams flexboxLp = 
        (FlexboxLayoutManager.LayoutParams) mImageView.getLayoutParams();
    flexboxLp.setFlexGrow(1.0f);
  }
}

効果は次のとおりです.
横画面でも縦画面でもよくフィットしていることがわかります.
この文章は終わりました.何か問題があれば、私に連絡してください.もし文の中に間違いがあったら、あなたの証言を歓迎します.感謝に堪えません.
完全なインスタンスコードを表示するには、次の手順に従います.
Playgroundインスタンスapp-FlexboxLayoutとFlexboxLayoutManagerを使用したCat galleryインスタンスapp-FlexboxLayoutManagerを使用した実装
Google公式ドキュメントからhttps://android-developers.googleblog.com/2017/02/build-flexible-layouts-with.html