やりたいこと
・web上のコンテンツをダイアログで表示
・ダイアログ幅は画面幅の90%
・ダイアログ高さはコンテンツサイズで可変にする
やる
- ダイアログの幅を固定
- WebViewの読み込みが終わった時点でダイアログの高さを算出して変更
ソース
WebViewDialogFragment.java
public class WebViewDialogFragment extends DialogFragment {
// 無関係なものは省略
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
binding = DialogWebViewBinding.inflate(inflater, container, false);
String url = "https://hogehoge";
binding.webview.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view , String url){
// コンテンツサイズによりダイアログ高さ変更
Dialog dialog = getDialog();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
// dp→px変換
DisplayMetrics metrics = getResources().getDisplayMetrics();
lp.height = (int)(view.getContentHeight() * metrics.scaledDensity);
dialog.getWindow().setAttributes(lp);
}
});
binding.webview.loadUrl(url);
return binding.getRoot();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 開始時点では幅のみ固定する
Dialog dialog = getDialog();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
DisplayMetrics metrics = getResources().getDisplayMetrics();
float scale = 0.9f;
lp.width = (int)(metrics.widthPixels * scale);
// 高さ0にしてダイアログを一旦非表示
lp.height = 0;
dialog.getWindow().setAttributes(lp);
}
}
ポイント
ダイアログのサイズ変更について
onCreateDialog
onCreateView
で dialog.getWindow().setAttributes(lp);
しても効かない。
onActivityCreated
のオーバーライドで対応する必要がある。
参考:Y.A.M の 雑記帳: Android DialogFragment では Dialog のサイズ指定は onActivityCreated でやれ
コンテンツの高さについて
WebView.getContentHeight()
でコンテンツの高さが取れるが、単位はdp。
DisplayMetrics.scaledDensity
を乗じてpxに変換してから設定する。