对v7包下的AlertDialog(弹出框)在实际开发中遇到的小问题进行阐述

本文主要是针对开发中遇到的小问题,以及目前依然存在的不解,大神们可以不妨耐心看下文中的不解之处,并希望能帮忙解惑。

首先对于目前弹出框,有很多方法实现,最常用的就是Dialog,AlertDialog和PopupWindow,还有比较绚丽的MaterialDialog,不论哪种若是想实现自己想要的需求,都可以进行重写该对象,并实现即可,本文就不再赘述这些了。

       本文主要想说的是把这些只作为一个弹出框模型,你想怎么实现效果,根据提供的方法往里面添加对应的东西就可以了。本次只针对v7包下的AlertDialog进行分析和对于PopupWindow进行一个小小的对比,好了 废话不多说,切入正题。

先上个有点瑕疵的效果图

看到这个效果图,是不是大家要说这么简单的效果图,几秒钟就实现了,还有啥可说的。莫慌,我的哥,待我细细道来。

首先这样子的一个效果图,图中有关闭按钮,有透明度的背景,如此一个效果图,首先 我个人认为用AlertDialog要比PopupWindow好一点。

看代码:

用AlertDialog实现

private AlertDialog showDialog(){
        final AlertDialog dialog;
        dialog=new AlertDialog.Builder(this).create();
        dialog.show();
        dialog.setContentView(R.layout.test);
        dialog.findViewById(R.id.imageColse).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        return dialog;
    }
布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/aaa"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@mipmap/bg_advert">

    <ImageView
        android:id="@+id/imageColse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="8dp"
        android:layout_marginTop="10dp"
        android:src="@mipmap/update_close" />

</RelativeLayout>

用PopupWindow实现

private void showPop(){
        View view=LayoutInflater.from(this).inflate(R.layout.test_pop,null);
        final PopupWindow popupWindow=new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
        popupWindow.setOutsideTouchable(false);
        ImageView imageColse= (ImageView)view.findViewById(R.id.imageColse);
        imageColse.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });
        popupWindow.showAtLocation(butn1, Gravity.CENTER,0,0);
    }
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/testpop"
    android:gravity="center"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/aaa"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:background="@mipmap/bg_advert"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/imageColse"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:layout_marginRight="8dp"
                android:layout_marginTop="10dp"
                android:src="@mipmap/update_close" />
        </RelativeLayout>
    </LinearLayout>
</LinearLayout>

首先从布局文件上对比,AlertDialog要比PopupWindow少很多,其次对于有透明度的背景,AlertDialog是系统渲染的,而PopupWindow是我们人为设置的。

其次就是在弹出的那一时刻的动画效果上,AlertDialog有明显的类似渐入溅出的效果,而PopupWindow的效果是很生硬的(虽然是可以设置的,这里对比的是在都不设置的情况下)。

另外可能大家都看到了,效果图中的瑕疵就是四个角会有白色的底,首先说明PopupWindow是不会出现的(咱还是好用的),是AlertDialog自身导致的,不过这个小问题也是我要说的问题,这个问题的解决首先在布局文件中设置background是透明的是无效的,试过了,就是这样子。这里需要在代码中添加一句话

dialog.getWindow().setBackgroundDrawableResource(R.color.transparentColor);
这样子就OK了,一句话就搞定了(这里的R.color.transparentColor是代表无色,透明的)。

其实无论是AlertDialog还是PopupWindow都用自己的应用场景,自己的长处,这里的对比也是十分的牵强的,只是小小的对比看下而已,莫要喷我,我是菜鸟哭


最后这里再说说我心中的疑惑,大家也许也看出来了我写的AlertDialog,与我们平时写的有所不同,这种写法是没有问题的,但是呢 疑惑是为何show方法必须写在前面,写在return上面就不行。很疑惑,其实对于我自己的理解目前还没有有力的证据说明,所以就不说出来给大家添加更多的疑惑,希望有大神看到了可以帮忙解解惑。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值