在屏幕android上更改Dialog的位置

时间:2012-02-27 14:52:00

标签: android android-layout android-intent android-emulator android-widget

我在活动

中制作了一个简单的AlertDialog
View view = layoutInflater.inflate(R.layout.my_dialog, null);
AlertDialog infoDialog = new AlertDialog.Builder(MyActivity.this)
                    .setView(view)  
                    .create();

infoDialog.show();

使用上面的代码,对话框会显示在屏幕中心的(大约)位置。

我想知道,如何自定义对话框位置以使其显示在顶部操作栏下? (无论如何改变对话的重力或某些东西?)以及如何根据我的代码做到这一点??

13 个答案:

答案 0 :(得分:200)

我使用此代码显示屏幕底部的对话框:

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在需要时调暗对话框的背景。您应该能够更改重力参数以移动关于

的对话框

答案 1 :(得分: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();
}

您可以根据重力和布局参数自定义对话框 根据您的要求改变重力和布局参数

答案 2 :(得分:8)

对我来说,这个问题非常顺利,我试图将对话框放在文本视图底部的某个位置。

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

答案 3 :(得分:8)

我在@gypsicoder代码here

中找到了此代码段
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位置值是从下到上。

答案 4 :(得分:6)

BottomSheetDialog

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

dialog.show();

答案 5 :(得分:4)

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

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

答案 6 :(得分:1)

dialog.getWindow().getAttributes().gravity = Gravity.BOTTOM;

答案 7 :(得分: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);
        }
    }

答案 8 :(得分:0)

对于我的Dialog活动,我使用了以下一项:

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

答案 9 :(得分:0)

我使用这种方法

 @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;

}

答案 10 :(得分:0)

使用bottomSHeet:

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

答案 11 :(得分:0)

您可以使用此代码段将AlertDialog放置在屏幕底部。

AlertDialog dialogPopup;

dialogPopup = mBuilder.create();
dialogPopup.getWindow().getAttributes().gravity = Gravity.BOTTOM;

答案 12 :(得分:0)

我用自定义布局编写了一个自定义对话框。 它有一个 cancel 和一个 save 按钮,您还可以在设备屏幕(底部)上设置重力并定义对话框的宽度和高度。

private void showDialog(final String scanContent, final String currentTime, final String currentDate) { LayoutInflater linf = LayoutInflater.from(this); final View inflator = linf.inflate(R.layout.dialog_barcode_result_dialog, null);

final Dialog dialog = new Dialog(this, android.R.style.Theme_DeviceDefault_Light_Dialog);

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

dialog.getWindow().setLayout(375, 350);

window.setLayout(WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.FILL_PARENT);
dialog.setTitle(null);
dialog.setContentView(R.layout.dialog_barcode_result_dialog);

dialog.setTitle(getResources().getString(R.string.dialog_title));
dialog.setContentView(inflator);

final Button save = inflator.findViewById(R.id.saveBtn);
final Button cancel = inflator.findViewById(R.id.cancelBtn);
final TextView message = inflator.findViewById(R.id.dialog_message_text);
message.setText(scanContent);
save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dialog.cancel();

    }
});
cancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dialog.cancel();

    }
});

dialog.show();

}

对话框布局xml文件为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:minWidth="350dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                android:textSize="16sp"
                android:layout_marginBottom="10dp"
                android:id="@+id/dialog_message_text"
                />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="right"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/cancelBtn"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/cancel" />

                <Button
                    android:id="@+id/saveBtn"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/button_save" />
            </LinearLayout>

        </LinearLayout>
    </ScrollView>
</LinearLayout>