Android - 如何使AlertDialog比标准更窄?

时间:2016-03-15 18:43:59

标签: android alertdialog android-progressbar layoutparams android-windowmanager

我目前有以下代码来构建一个带有ProgressBar的等待对话框:

LayoutInflater factory = LayoutInflater.from(TherapistActivity.this);
View view = factory.inflate(R.layout.waitdialog, null);
dialog = new AlertDialog.Builder(TherapistActivity.this)
    .setView(view)
    .setCancelable(false)
    .create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();

wmlp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
wmlp.x = 0;   //x position
wmlp.y = Math.round(metrics.density * 100);   //y position

wmlp.width = Math.round(metrics.density * 55);  //doesn't appear to work

以下是我的对话框的XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/top"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:background="@drawable/boxbkg">

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true"/>


</RelativeLayout>

我希望我的对话框是一个只有旋转ProgressBar的小方块对话框。但是,即使使用wmlp.width = Math.round(metrics.density * 55),对话框仍然很宽。

解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

据我所知,更改对话框 - 参数/宽度和高度 - 应该在onCreate(需要设置样式)和onCreateDialog(设置参数)中进行。

来自自定义DialogFragment的这两种方法的示例,它们在整个屏幕上发生,没有任何边距:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme);
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    Window w = dialog.getWindow();
    w.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
    WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
    params.verticalMargin = 0;
    params.horizontalMargin = 0;
    params.x=0;
    params.y = 0;
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    params.width= ViewGroup.LayoutParams.MATCH_PARENT;
    params.height = ViewGroup.LayoutParams.MATCH_PARENT;
    w.setGravity(Gravity.TOP| Gravity.LEFT);

    return dialog;
}

如果有帮助,请告诉我。

答案 1 :(得分:0)

我明白了。看来我还需要两行代码。在设置宽度之前,我需要这行代码:

wmlp.copyFrom(dialog.getWindow().getAttributes());

设置宽度后,我需要这行代码:

dialog.getWindow().setAttributes(wmlp);

答案 2 :(得分:0)

不幸的是,原始代码与答案中的其他代码结合使用不适用于我的代码,这可能是由于使用v_intention7引起的。

以下代码(已通过Java 8 / min API 24 / target API 27测试)可与Fragment一起使用,并适用于纵向和横向屏幕方向。它使您可以将对话框的大小设置为任意大小(请参见下文),而无需设置其位置,因为最后它仍然只是带有自定义{{的常规Fragment(无按钮或标题) 1}}:

AlertDialog

我的view布局:

AlertDialog.Builder builder = new AlertDialog.Builder((AppCompatActivity) getActivity());
builder.setView(R.layout.progress_view);
AlertDialog loadingDialog = builder.create();
loadingDialog.show();
loadingDialog.getWindow().setLayout(400,400); //You have to call this after "show"!
//loadingDialog.dismiss();

我以前尝试使用progress_view,但没有成功,对话框仍然使用其原始大小。这里重要的一点是<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/progress_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:background="#FF0000" android:gravity="center" android:orientation="vertical" android:paddingBottom="20dp" android:paddingEnd="20dp" android:paddingStart="20dp" android:paddingTop="20dp"> <ProgressBar android:id="@+id/progressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> ,因为只有这样才能使进度圈实际上位于LinearLayout的中心。使用match_parent将其推到对话框的左上方。

结果如下:

enter image description here

您当然可以添加更多内容,例如AlertDialog,或将背景颜色设置为您想要的任何颜色,这只是我注意到的两件事:

  1. 透明度不起作用。如果您将背景设置为50%Alpha,您可以通过它看到wrap_content的白色背景。我尝试按照建议的here(自定义样式或TextView)更改对话框的透明度,但是,即使它起作用了,该对话框仍然失去圆角并被压扁了。
  2. 您必须测试适合您的尺码。对于默认的进度圈和一些填充,400 x 400很好,但是如果您将对话框设置得太小而不适合视图的内容,则根本不会显示。