【问题标题】:Custom AlertDialogs/Dialogs in Android appearance issuesAndroid 外观问题中的自定义 AlertDialogs/Dialogs
【发布时间】:2015-04-02 05:46:53
【问题描述】:

我已经在 Android 中实现了以下对话框,但有一些问题我无法弄清楚为什么会发生。

  1. 我不明白为什么在顶角和底角有一个空白。以及如何删除它!
  2. 由于我使用的是 Dialog 而不是 AlertDialog,因此当我触摸屏幕上的其他位置时,此消息会消失。我想防止这种情况发生,并希望仅当用户选择这两个选项中的任何一个时才关闭消息框。
  3. 无论我尝试了多少次,我都无法获得相同宽度的“取消”和“擦除”按钮。

这里是 XML

custom_alert.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:background="@drawable/custom_alert_layout"
android:id="@+id/alert_layout"
android:paddingBottom="15dp"
android:paddingTop="10dp"
android:layout_height="wrap_content">
<ImageView
 android:layout_width="40dp"
 android:layout_height="40dp"
 android:id="@+id/alert_icon_imageview"
 android:src="@drawable/alerticon"
 android:layout_alignParentTop="true"
 android:layout_alignLeft="@+id/alert_msg"
 android:layout_alignStart="@+id/alert_msg" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/alert_title"
 android:text="TITLE"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#0a4d4a"
 android:layout_alignParentTop="true"
 android:layout_toRightOf="@+id/alert_icon_imageview"
 android:layout_toEndOf="@+id/alert_icon_imageview"
 android:layout_marginLeft="20dp" />
<ImageView
android:layout_width="match_parent"
android:layout_height="2dp"
 android:layout_marginTop="10dp"
 android:layout_marginRight="4dp"
 android:layout_marginLeft="2dp"
android:id="@+id/alert_divider_imageview"
android:layout_below="@+id/alert_title"
android:src="@drawable/alertdivider"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/alert_msg"
 android:text="MESSAGE"
 android:layout_marginTop="10dp"
 android:layout_marginLeft="10dp"
android:textSize="16sp"
android:layout_below="@+id/alert_divider_imageview"
android:textColor="#ff373334"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="2dp"
 android:layout_marginRight="4dp"
 android:layout_marginLeft="2dp"
 android:layout_marginTop="10dp"
android:id="@+id/alert_divider_imageview2"
android:layout_below="@+id/alert_msg"
android:src="@drawable/alertdivider"/>
<Button
 android:layout_width="150dp"
android:id="@+id/alert_cancel"
 android:layout_marginLeft="10dp"
 android:layout_marginRight="5dp"
 android:layout_marginTop="15dp"
 android:textColor="#ffffff"
 android:textStyle="bold"
android:text="CANCEL"
 android:background="@drawable/custom_alert_cancel"
 android:layout_height="wrap_content"
 android:layout_below="@+id/alert_divider_imageview2"
  />
<Button
android:layout_width="150dp"
android:id="@+id/alert_ok"
android:text="ERASE"
 android:textStyle="bold"
 android:layout_marginRight="10dp"
 android:layout_marginLeft="5dp"
 android:layout_marginTop="15dp"
 android:textColor="#ffffff"
 android:background="@drawable/custom_alert_ok"
 android:layout_toRightOf="@+id/alert_cancel"
 android:layout_height="wrap_content"
android:layout_below="@+id/alert_divider_imageview2" />
</RelativeLayout>

custom_alert_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" >
    <shape android:shape="rectangle">
        <corners android:radius="10dp"/>
        <solid android:color="#139977" />
        <stroke android:width="2dp" android:color="#0a4d4a" />
    </shape>
</item>
</selector>

【问题讨论】:

  • 从根布局中移除android:paddingTop="10dp"
  • 发布显示对话框代码。你是怎么膨胀的。
  • 您需要删除标题栏并为对话框设置透明背景。阅读stackoverflow.com/questions/13495161/…

标签: android customization android-alertdialog android-dialog


【解决方案1】:

你能发布你的活动代码吗?

在你的活动中试试这个:

    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.alert_dialog);

    Button okBtn = (Button) dialog.findViewById(R.id.ok_btn);
    Button cancelBtn = (Button) dialog.findViewById(R.id.cancel_btn);

    okBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            doErase();  
        }
    });
    cancelBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            dialog.dismiss();

        }
    });

    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    dialog.setCancelable(false);
    dialog.show();

【讨论】:

    【解决方案2】:

    要解决第三个问题,从 xml 中删除按钮并使用对话框的内置按钮。 setPositiveButton()setNegativeButton()dialog 类的方法。 它会给你相同大小的按钮。

    【讨论】:

      【解决方案3】:

      解决你可以在xml中使用的第一个问题

      <item name="android:background">@android:color/transparent</item>
      

      或者在java中

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

      【讨论】:

      • 为什么同一个问题有 2 个答案?
      【解决方案4】:

      只需在对话框中添加一行即可删除对话框的操作栏和标题栏:

      Dialog dialog = new Dialog(MainActivity.this);
              dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); //add this line
              dialog.setContentView(R.layout.activity_main);
      

      【讨论】:

        【解决方案5】:

        为解决您的第一个问题,在setContentView 之前添加此代码

        Window window = actDialog.getWindow();
            WindowManager.LayoutParams wlp = window.getAttributes();
        
            window.setAttributes(wlp);
            window.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        
            actDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        

        你的第二个问题解决方案

        actDialog.setCanceledOnTouchOutside(false);
        

        您的第三个问题解决方案在这里

        将你的两个Button 放入LinearLayout 并给layout_weight 相同

        【讨论】:

          【解决方案6】:

          1.删除顶部的空白: 将这两行添加到您的对话框中,

                 dialog.getWindow();
                 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                 dialog.setContentView(R.layout.alert_dialog);
          

          删除底部的空白,在您的代码中只删除下面的行

           <corners android:radius="10dp"/> 
          

          来自您的 custom_alert_layout.xml 文件。

          2.解决第二个问题:在代码中添加以下两行,

            dialog.setCancelable(false);
            dialog.setCanceledOnTouchOutside(false);
          

          3.要使按钮的宽度相同,请使用 LinearLayout 作为两个按钮的父级,并为按钮赋予相同的权重。

          【讨论】:

            【解决方案7】:

            对于您的第三个问题 这是代码

            <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" >
            
             <Button
            android:layout_width="match_parent"
            android:id="@+id/alert_cancel"
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:layout_marginRight="5dp"
            android:layout_marginTop="15dp"
            android:textColor="#ffffff"
            android:textStyle="bold"
            android:text="CANCEL"
            android:background="@drawable/custom_alert_cancel"
            android:layout_height="wrap_content"
            />
            <Button
            android:layout_width="match_parent"
            android:id="@+id/alert_ok"
            android:text="ERASE"
            android:textStyle="bold"
            android:layout_weight="1"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="15dp"
            android:textColor="#ffffff"
            android:background="@drawable/custom_alert_ok"
            android:layout_height="wrap_content"
            />
            </LinearLayout>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多