【问题标题】:Android - How to make an AlertDialog narrower than standard?Android - 如何使 AlertDialog 比标准更窄?
【发布时间】:2016-07-01 09:09:54
【问题描述】:

我目前有以下代码来构建带有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),对话框仍然很宽。

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

【问题讨论】:

  • dialog 是一个AlertDialog,你必须在最后调用dialog.show(),否则它不会显示任何内容。不幸的是,即使使用已接受答案中的附加代码,这也不起作用。

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


【解决方案1】:

据我所知,更改对话框 - 参数/宽度和高度 - 应该在 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;
}

如果对你有帮助,请告诉我。

【讨论】:

    【解决方案2】:

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

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

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

    dialog.getWindow().setAttributes(wmlp);
    

    【讨论】:

    • 我试过了,但没用:对话框永远不会改变宽度,无论我设置什么(使用RelativeLayoutwrap_content)。不知道这是否是由使用 Fragment 引起的。
    【解决方案3】:

    不幸的是,原始代码与答案中的额外代码无法与我的代码一起使用,这可能是由于使用了Fragment

    以下代码(使用 Java 8/min API 24/目标 API 27 测试)适用于 Fragment 以及纵向和横向屏幕方向。它允许您将对话框的大小设置为您喜欢的任何大小(见下文),并且无需设置其位置,因为最终它仍然只是一个普通的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,因为只有这样才能真正将进度圈置于AlertDialog 的中心。使用wrap_content 会将其推送到对话框的左上角。

    结果如下:

    您当然可以添加更多内容,例如“请稍候...”TextView 或将背景颜色设置为您想要的任何颜色,我注意到了两件事:

    1. 透明度不起作用。如果您将背景设置为例如50% alpha,通过它可以看到AlertDialog的白色背景。我尝试按照here(自定义样式或getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)))的建议更改对话框的透明度,但即使它有效,对话框最终失去了圆角并被压扁。
    2. 您必须测试适合您的尺寸。 400 x 400 适合默认进度圈和一些填充,但如果对话框太小而无法显示视图内容,则根本不会显示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多