最初に
ModalなBottomSheetsを実装するのに、サード・パーティのライブラリを使っていた。
先日のDroidKaigi2016で、Support LibraryにBottomSheetsが実装されると聞き、待っていたらすぐリリリースされた!
なので、さっそくライブラリを置き換えてみた。
問題発生
通常のDialogFragmentをBottomSheetDialogFragmentに変えて実装してみた。
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
mContentView = View.inflate(getContext(), R.layout.dialog_content, null);
dialog.setContentView(mContentView);
}
そうすると、このようにDialogの中身が全部表示されない。。。
問題解決
色々と試してみた結果、以下のように書くと中身が全部表示された。(∩´∀`)∩ワーイ
@Override
public void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style);
mContentView = View.inflate(getContext(), R.layout.dialog_content, null);
dialog.setContentView(mContentView);
mListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// BottomSheetの高さなどを設定
View parent = (View) mContentView.getParent();
BottomSheetBehavior behavior = BottomSheetBehavior.from(parent);
behavior.setPeekHeight(mContentView.getMeasuredHeight());
CoordinatorLayout.LayoutParams layoutParams =
(CoordinatorLayout.LayoutParams) ((View) mContentView.getParent()).getLayoutParams();
layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
// OnGlobalLayoutListenerを外す
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
removeGlobalLayoutListener();
} else {
removeGlobalLayoutListenerCompat();
}
}
};
mContentView.getViewTreeObserver().addOnGlobalLayoutListener(mListener);
}
サンプルのコードは、GitHubで公開しています。