在Android屏幕上更改对话框的位置


111

AlertDialogActivity中做了一个简单的说明:

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 2012年

Answers:


233

我使用以下代码在屏幕底部显示了对话框:

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 2012年

6
您可以尝试使用wlp.xwlp.y字段来显式设置对话框在屏幕上的位置。我自己还没有尝试过,但是应该可以。
Aleks G

4
清除暗淡对我不起作用(尽管其余的都像魅力一样起作用)。我在另一个地方找到了一种变暗的解决方案,形式为:window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG是否有办法改变昏暗背景的颜色,使dailog居中?我尝试将windowIsFloating = false设置为dailog样式。但是它使dailog与顶部对齐!
Kshitij

@Kshitij如果要将对话保持在中心,则不需要任何代码-默认情况下,Android会进行对话。至于改变暗色,这是由主题控制的。您可以通过在应用程序中包含相应的主题来覆盖它。我从来没有尝试过。
Aleks G

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 2012年

3
您可以将边距设置为布局的顶部
Ramesh Solanki 2012年

'FILL_PARENT'不推荐使用。我使用的是
API21

1
@ fWd82,请改用“ MATCH_PARENT”
William

12

我发现这个代码片断从@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

对我来说,这很不错,在我试图将对话框准确定位在被选中的textview底部的地方。

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);
}

9

新品BottomSheetDialog

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

dialog.show();

5

只需将其添加到您的代码中:

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


1

对于我的Dialog活动,我使用了以下内容:

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);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.