【问题标题】:Custom Alertdialog width is bigger than the shown width in layout xml自定义警报对话框宽度大于布局 xml 中显示的宽度
【发布时间】:2018-11-02 07:45:42
【问题描述】:

我正在尝试创建自定义警报对话框。这是我的 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>

以及我调用自定义警报对话框的活动中的代码

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

问题甚至在布局文件中线性布局宽度被包装到它的内容中,像这样

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

【问题讨论】:

  • 将父级相对布局宽度从match_parent更改为wrap_content
  • 对线性布局的子元素使用固定大小。

标签: android android-layout android-alertdialog android-dialog


【解决方案1】:

试试这个

给子元素设置背景色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();

【讨论】:

    【解决方案2】:

    只需使用具有所需宽度和高度的 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)
    }
    

    【讨论】:

      【解决方案3】:
        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();
                      }
      

      【讨论】:

      • 嗨 Prateek 感谢您的快速回复。我尝试了您的解决方案,它使布局变得透明。但问题是我在 imageview 上显示了这个警报,所以它下面的图像有各种颜色。因此,由于该警报有时可能不可见(取决于其下方的颜色)。所以我要使用带有白色背景和带有旋转条的黑色文本的警报对话框。再次感谢您的回复:)
      【解决方案4】:

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

      使用以下内容创建主题:

      <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()
      

      【讨论】:

        【解决方案5】:

        如下改变你的相对布局

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

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

        【讨论】:

        • 嗨,卡兰。感谢您的建议:)。我试过了,还是一样。
        • @d91:对不起,我之前忘记编辑了,我已经检查过了,它可以工作。试着告诉我。
        • 您好,不用担心,我又试了一次。发生的事情是旋转条和 textview 在同一个空白区域中向左移动。我正在尝试包装内容,以使不必要的白色区域消失。无论如何,非常感谢你试图帮助我。 :)
        猜你喜欢
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 2011-06-17
        • 1970-01-01
        相关资源
        最近更新 更多