AlertDialog攻略カスタム幅、グレー背景の透明度を変更

6002 ワード

Androidプロジェクトでは、下部からオプションなどがポップアップされることがよくあります.実現には、popupwindowや、透明なグレーの背景のviewをcoverとして定義し、コンテンツを表示するvisibilityプロパティや補助アニメーションを設定することで、このような効果を達成する方法がたくさんあります.ただし、グレーの背景は常にステータスバーを上書きできません.Dialogを使用すると、グレーのバックグラウンド全体の浸透体験効果が得られます.しかし、Dialogの使用時の幅は一般的に画面幅に満ちていないので、この問題を解決します.
<style name="bottom_dialog" parent="Theme.AppCompat.Dialog">
        <item name="android:windowBackground">@color/transparent
    style>

Windows Backgroundは、コンテンツ領域を表示するウィンドウの背景色であり、画面全体の背景色ではありません.backgroundもスクリーン背景色を変更することはできません.スクリーン背景色は以下のように透明度を変更できます.あるいは、layoutをカスタマイズし、layoutの高さと幅をスクリーン全体に満たすことで、背景色を自分で定義することができます.
上のスタイルを使用して、後でAlertDialogにあげるスタイルとします.画面の下部にコンテンツを表示する必要があるので、BottomDialogを定義します.java:
public class BottomDialog {

    private AlertDialog alertDialog;

    public BottomDialog( AlertDialog alertDialog){
        this.alertDialog = alertDialog;
        if (null != alertDialog) {
            init();
        }
    }

    private void init(){
        Window window = alertDialog.getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE);


    }

    public void show(){
        if (null != alertDialog){
            alertDialog.show();
            Window window = alertDialog.getWindow();
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            window.setGravity(Gravity.BOTTOM);
            layoutParams.width = window.getWindowManager().getDefaultDisplay().getWidth();
            layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            window.setAttributes(layoutParams);
        }
    }

    public void dismiss(){
        if (null != alertDialog){
            alertDialog.dismiss();
        }
    }
}

使用時:
if (commentDialog == null) {
                    commentDialog = new BottomDialog(
                            new AlertDialog.Builder(ArticleDetailActivity.this, R.style.bottom_dialog)
                                    .setView(v_comment_input)
                                    .create()
                    );
                }
                commentDialog.show();

これによりdialogはウィンドウの下部にフルスクリーンで表示されます.またdialogのview内は入力ボックスに完璧に適応できます.
他の領域の透明グレーのオーバーライドがあなたのニーズに合わない場合:


    

    
android:backgroundDimAmountプロパティを変更すると、透明度が異なります.
また、「Theme.AppCompat.DialogWhenLarge」スタイルをそのまま継承し、幅をカスタマイズすることなくフルスクリーンにできるはずです.しかし、styleには透明なグレーのカバー層がなく、name="android:backgroundDimEnabled" trueを追加することで解決できるはずです.もし問題を解決してくれたら、伝言で知らせてください.ありがとうございます.