画面のアンドロイドでダイアログの位置を変更する


111

私はAlertDialog自分の活動でシンプルにしました:

View view = layoutInflater.inflate(R.layout.my_dialog, null);
AlertDialog infoDialog = new AlertDialog.Builder(MyActivity.this)
                    .setView(view)  
                    .create();

infoDialog.show();

上記のコードでは、ダイアログは画面の(ほぼ)中央に表示されます。

ダイアログの位置をカスタマイズして、上部のアクションバーのすぐ下に表示するにはどうすればよいですか。(とにかく重力やダイアログの何かを変更する方法はありますか?)そして私のコードに基づいてそれを行う方法は?


my_dialog xmlレイアウトをご提示いただければ、おそらく変更をお手伝いいたします。
アランムーア


@ Ankit、私のコメントはあなたのリンクをチェックした後に解決されるので、あなたのコメントを答えとして入れることができます
Leem.fin

回答:


235

このコードを使用して、画面の下部にダイアログを表示しました。

Dialog dlg = <code to create custom dialog>;

Window window = dlg.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();

wlp.gravity = Gravity.BOTTOM;
wlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(wlp);

このコードは、必要に応じて、Androidがダイアログの背景を淡色表示しないようにします。重力パラメータを変更してダイアログを動かすことができるはずです


こんにちは、ありがとう。重力を上に設定すると、ダイアログが画面の上部に表示されますが、アクションバーも覆われています。ダイアログを上部に配置したいのですが、アクションバーのすぐ下に配置します。これを調整するにはどうすればよいですか?
Leem.fin

6
wlp.xwlp.yフィールドを使用して、画面上のダイアログの場所を明示的に設定してみてください。私自身は試したことはありませんが、おそらく機能するはずです。
Aleks G

4
減光のクリアは私にはうまくいきませんでした(残りは魅力のように働きました)。別の場所で、次の形式の調光の解決策を見つけました。window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck 14年

@AleksGダイログを中心にして、薄暗い背景の色を変更する方法はありますか?windowIsFloating = falseをdailogスタイルに設定してみました。しかし、それはdailogを上に揃えます!
Kshitij 2014

@Kshitijダイアログを中央に保持する場合は、このコードは必要ありません。Androidはデフォルトでダイアログを中央に配置します。薄暗い色の変更に関しては、これはテーマによって制御されます。アプリに対応するテーマを含めることで、それをオーバーライドできる場合があります。私はそれを試したことはありません。
Aleks G 2014

23
private void showPictureialog() {
    final Dialog dialog = new Dialog(this,
            android.R.style.Theme_Translucent_NoTitleBar);

    // Setting dialogview
    Window window = dialog.getWindow();
    window.setGravity(Gravity.CENTER);

    window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    dialog.setTitle(null);
    dialog.setContentView(R.layout.selectpic_dialog);
    dialog.setCancelable(true);

    dialog.show();
}

重力とレイアウトパラメータに基づいてダイアログをカスタマイズできます。要件に基づいて重力とレイアウトパラメータを変更します


1
こんにちは、ありがとう。重力を上に設定すると、ダイアログは画面の上部に表示されますが、アクションバーも覆われています。ダイアログを上部に配置したいのですが、アクションバーのすぐ下に配置します。これを調整するにはどうすればよいですか?
Leem.fin

3
レイアウトの上部にマージンを設定できます
Ramesh Solanki 2012

'FILL_PARENT'廃止予定です。私はによると、API 21日午前開発者用リファレンス
fWd82

1
@ fWd82なので、代わりに「MATCH_PARENT」を使用してください
William

13

私はここで @gypsicoderコードからこのコードスニペットを見つけまし

private CharSequence[] items = {"Set as Ringtone", "Set as Alarm"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {

        if(item == 0) {

        } else if(item == 1) {

        } else if(item == 2) {

        }
    }
});

AlertDialog dialog = builder.create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();

wmlp.gravity = Gravity.TOP | Gravity.LEFT;
wmlp.x = 100;   //x position
wmlp.y = 100;   //y position

dialog.show();

ここで、x位置の値は左から右へのピクセルです。yの位置の値は下から上です。


10

私にとって、これは、ダイアログをテキストビューの一番下の選択された場所に正確に配置しようとしたところ、かなりうまくいきました。

public void setPosition(int yValue) {
    Window window = getWindow();
    WindowManager.LayoutParams param = window.getAttributes();
    param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    param.y = yValue;
    window.setAttributes(param);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}


5

これをコードに追加するだけです:

dialog.getWindow().setGravity(Gravity.BOTTOM);


1

私のダイアログアクティビティでは、これを使用しました:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;

1

私はこの方法を使います

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    Window window = dialog.getWindow();
    WindowManager.LayoutParams wlp = window.getAttributes();
    wlp.gravity = Gravity.BOTTOM;
    dialog.setContentView(R.layout.dialog_droppoint);
    dialog.show();
    window.setAttributes(wlp);
    return dialog;

}

0

bottomSHeetを使用:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();

0
public class MyDialogFragment extends DialogFragment{
    protected void setDialogGravity(int gravity) {
        Dialog dialog = getDialog();
        if (dialog != null) {
            Window window = dialog.getWindow();
            if (window != null) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.width = WindowManager.LayoutParams.MATCH_PARENT;
                params.height = WindowManager.LayoutParams.MATCH_PARENT;
                params.horizontalMargin = 0;
                params.gravity = gravity;
                params.dimAmount = 0;
                params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                window.setAttributes(params);
            }
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        return inflater.inflate(R.layout.my_dialog, null);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
                setDialogGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.