带有圆角和透明背景的 Android 自定义警报对话框

Posted

技术标签:

【中文标题】带有圆角和透明背景的 Android 自定义警报对话框【英文标题】:Android custom alert dialog with rounded corners and transparent background 【发布时间】:2014-03-13 22:21:43 【问题描述】:

我使用LinearLayoutonDraw 创建了一个带有圆角的自定义AlertDialog,如下所示,

public class RoundedLinearLayout extends LinearLayout 

private Paint drawPaint;
private Paint roundPaint;

private int mCornerRadius = 100;

private RectF bounds;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public RoundedLinearLayout(Context context, AttributeSet attrs, int defStyle) 
    super(context, attrs, defStyle);
    onInit();


public RoundedLinearLayout(Context context, AttributeSet attrs) 
    super(context, attrs);
    onInit();


public RoundedLinearLayout(Context context) 
    super(context);
    onInit();


protected void onInit() 
    drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    drawPaint.setColor(0xffffffff);
    drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

    roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    roundPaint.setColor(0xffffffff);

    setWillNotDraw(false);


@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) 
    super.onSizeChanged(w, h, oldw, oldh);
    if (w != oldw && h != oldh) 
        bounds = new RectF(0, 0, w, h);
    


@Override
protected void dispatchDraw(Canvas canvas) 
    Bitmap bitmap = Bitmap.createBitmap((int) bounds.width(), (int) bounds.height(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bitmap);
    super.dispatchDraw(c);

    BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShader(shader);

    canvas.drawRoundRect(bounds, mCornerRadius, mCornerRadius, paint);


然后我通过 getWindow() 添加透明度并设置 window.alpha = 0.5f 。 结果对话框是,

我想删除那些角落的白色背景。我在这里搜索了 100 多个问题,但没有答案可以让我获得完美的圆角警报对话框。任何帮助将不胜感激!

【问题讨论】:

android Dialog - Rounded Corners and Transparency的可能重复 【参考方案1】:

    使用 dialog_corner 在可绘制文件夹中创建 xml。

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/main_background"/> <corners android:topLeftRadius="@dimen/margin_10" android:topRightRadius="@dimen/margin_10" android:bottomRightRadius="@dimen/margin_10" android:bottomLeftRadius="@dimen/margin_10" /> </shape>

2.放入布局

android:background="@drawable/dialog_corner"

3.在你的java文件中保留下面的代码

View mView =LayoutInflater.from(mContext).inflate(R.layout.layout_pob,null); 
         alertDialog.getWindow().setBackgroundDrawable(new   ColorDrawable(Color.TRANSPARENT));

【讨论】:

【参考方案2】:

这个可以解决:

   dialog.getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_verification));

【讨论】:

【参考方案3】:

这是第一次为我工作

dialog.getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_verification));

这里是从drawable文件夹获取资源,background_verification是drawable文件

【讨论】:

【参考方案4】:

这对我有用

dialog.getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_verification));

背景验证是我的drawable文件

【讨论】:

【参考方案5】:

使用这个:

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

这是最简单的解决方案,而且很有效。

【讨论】:

【参考方案6】:

我用这个,它对我有用:

ConfirmacionMensaje customDialog = new ConfirmacionMensaje(MainActivity.this);
customDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
customDialog.show();

ConfirmacionMensaje 从对话框扩展

这是我用于对话框的 xml:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<solid android:color="#ffDB0000"/>
<corners
    android:bottomLeftRadius="4dp"
    android:bottomRightRadius="4dp"
    android:topLeftRadius="4dp"
    android:topRightRadius="4dp" />
</shape>

【讨论】:

如何弹出?我试过这个 popup.getContentView().setBackgroundResource(android.R.color.transparent);但没用【参考方案7】:

如果您的对话框是 AlertDialogDialog 的实例,请将以下内容添加到您的代码中:

myDialog
    .getWindow()
    .setBackgroundDrawable(new ColorDrawable(Color.argb(0,0,0,0)));

旁注:扩展LinearLayout 以应用圆角框,我认为这不是一个好习惯,您也可以通过非常简单的 XML 表示来做到这一点,在这种情况下,XML 矩形可以提供更多帮助:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    ...
    <corners
        android:radius="3dp" />
    ...
</shape>

【讨论】:

感谢您的宝贵时间!我已经尝试了这两种方法,但无法消除那些白色的角落。【参考方案8】:

您确定要使用对话框吗? 它看起来更像是一个临时弹出窗口,比如吐司或面包块:

http://www.grokkingandroid.com/useful-android-libraries-crouton/ http://www.androidviews.net/2013/05/httpsimonvt-github-iomessagebar/ https://plus.google.com/+RomanNurik/posts/RA9WEEGWYp6 。

关于背景,您可以使用 9-patch 或自定义 xml 可绘制对象(例如 herehere)...

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 @LeeTaylor 有很多代码要复制到这里。对不起。【参考方案9】:

使用警告对话框使用简单对话框

 LayoutInflater  factory = LayoutInflater.from(getActivity());
            AlertDialog alert = new AlertDialog.Builder(getActivity());

        Dialog  dialog = new Dialog(getActivity());

            dialog.setContentView(your layout);

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

【讨论】:

根据Dialogs:“Dialog 类是对话框的基类,但你应该避免直接实例化 Dialog。”这可能会解决透明角问题,但对我来说它引入了其他问题。 我尝试了十几种不同的方法,而这确实是唯一有效的方法。无论文档怎么说,您都必须使用简单的Dialog

以上是关于带有圆角和透明背景的 Android 自定义警报对话框的主要内容,如果未能解决你的问题,请参考以下文章

Android:带有自定义标题的圆角TextView XML布局

如何在通知内容扩展中为我的自定义视图应用自定义字体/颜色和半透明背景?

如何在android中制作带有圆角的自定义对话框

自定义弹出框警报视图

android 自定义progressbar怎么让右侧也是圆角

带有css圆角的谷歌地图自定义标记