自定义 Alertdialog 宽度大于布局中显示的宽度 xml

Custom Alertdialog width is bigger than the shown width in layout xml

我正在尝试创建自定义警报对话框。这是我的 alertdialog 自定义布局 xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:gravity="center"
    android:orientation="horizontal">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Processing" />
</LinearLayout>
</RelativeLayout>

以及来自 activity 的代码,我在其中调用自定义警报对话框

   LayoutInflater inflater = MainActivity.this.getLayoutInflater();
   View dialogView = inflater.inflate(R.layout.layoutalertprogress, null);
   AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
   alertDialogBuilder.setView(dialogView);
   alertDialog = alertDialogBuilder.create();
    if(!alertDialog.isShowing())
      {
           alertDialog.show();
      }

问题甚至在布局文件中 linearlayout 宽度也像这样包装到它的内容中

alertdialog 的实际宽度在运行时看起来像这样 所以 alertdialog 的实际宽度更宽(比上面显示的布局更宽)。 似乎 linearlayout 宽度没有包裹到它的内容中,所以从它的边缘到它的子元素有很大的未使用 space。如何使此线性布局宽度包裹其内容,以便可以删除其边缘未使用的 space ?谢谢

  LayoutInflater inflater = MainActivity.this.getLayoutInflater();
                View dialogView = inflater.inflate(R.layout.layoutalertprogress, null);
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
                alertDialogBuilder.setView(dialogView);
                AlertDialog alertDialog = alertDialogBuilder.create();
                alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#00000000")));
                if(!alertDialog.isShowing())
                {
                    alertDialog.show();
                }

如下更改您的相对布局

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

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:gravity="center"
    android:orientation="horizontal">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="Processing" />
</LinearLayout>
</LinearLayout>

style.xml 中为 alertdialog 创建一个主题,如下所示

<style name="AlertDialogCustom" parent="AlertDialog.AppCompat">
        <item name="android:textColor">#00FF00</item>
        <item name="android:typeface">monospace</item>
        <item name="android:textSize">10sp</item>
        <item name="android:layout_width">wrap_content</item>
</style>

创建以下方法来调用您的对话框。

public void showDemoDialog() {
        LayoutInflater inflater = MainActivity.this.getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.demodg, null);
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this, R.style.AlertDialogCustom);
        alertDialogBuilder.setView(dialogView);
        AlertDialog alertDialog = alertDialogBuilder.create();
        if (!alertDialog.isShowing()) {
            alertDialog.show();
            alertDialog.getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        }

    }

这是在设备上 运行 时的结果。

试试这个

设置子背景颜色 LinearLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:background="@android:color/white"
        android:orientation="horizontal">

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Processing" />
    </LinearLayout>
</RelativeLayout>

然后在您的 java 代码中添加这一行

 alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

之后

AlertDialog alertDialog = alertDialogBuilder.create();

我遇到了同样的问题,对我有用的解决方案是:

使用以下内容创建主题:

<style name="yourThemeName" parent="Theme.AppCompat.Dialog">
       ...
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

然后在代码中:

 inflatedView= layoutInflater.inflate(R.layout.yourLayoutId, null)
  dialog = AlertDialog.Builder(this, R.style.yourThemeName)
            .setView(inflatedView)
  dialog.show()

只需使用 setLayout 方法和您想要的宽度和高度。这将使您的对话框宽度和高度符合指定。 Kotlin 版本,

private fun showDialog() {
    val dialog = AlertDialog.Builder(this)
    val layout = LayoutInflater.from(this).inflate(R.layout.custom_dialog_layout, null, false)
    dialog.setView(layout)

    val alert = dialog.create()

    alert.show()
    alert.window?.setBackgroundDrawableResource(android.R.color.transparent)
    alert.window?.setLayout(600, 600)
}