自定义弹出AlertDialog弹出框

翻译自:http://m.blog.csdn.net/article/details?id=50416876


最近在做一个电商项目,需要有一键退出功能,但是系统的AlertDialog风格不符合要求,需要自定义一个,在网上扒了很久,终于找到了一个写的清晰的,适合我这种小菜鸟看的,现在按着圆柱作者的叙述做了一遍,很简单有效,同时也加入了自己想要的点击空白处不能让对话框消失的设置,好了,废话不多说,上效果图,再次感谢原著作者.




1.上代码:这个布局文件是一个单独的layout,但需要说明的是在这里面设置的宽高并不会起作用,详细介绍请看原博文,至于应该怎么配置,后边会介绍到.

  <TextView
        android:gravity="center"
        android:text="提示\n确定要退出登录吗"
        android:layout_width="200dp"
        android:layout_height="40dp" />

    <LinearLayout
        android:layout_width="200dp"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/cancle"
            android:gravity="center"
            android:text="取消"
            android:layout_width="100dp"
            android:layout_height="20dp" />

        <TextView
            android:id="@+id/ok"
            android:gravity="center"
            android:text="确定"
            android:layout_width="100dp"
            android:layout_height="20dp" />
    </LinearLayout>


2.在values/styles.xml文件中自定义如下style:

 <!--新增的弹出框风格,继承自Theme.DialogTheme.Dialog-->
    <style name="MsgDialog" parent="@android:style/Theme.Dialog">
        <!--没有边框;没有背景色;没有标题;窗口浮动;没有阴影 -->
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@null</item>
        <item name="android:windowNoTitle">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>


3.自定义一个继承自AlertDialog的类:

public class MsgDialog extends Dialog {

    private TextView positiveButton;
    private TextView negativeButton;

    public MsgDialog(Context context) {
        super(context);
        setMsgDialog();
    }

    private void setMsgDialog() {
        View mView = LayoutInflater.from(getContext()).inflate(R.layout.self_dialog, null);
        TextView title = (TextView) mView.findViewById(R.id.title);
        positiveButton = (TextView) mView.findViewById(R.id.ok);
        negativeButton = (TextView) mView.findViewById(R.id.cancle);
        if (positiveButton != null) positiveButton.setOnClickListener(listener);
        if (negativeButton != null) negativeButton.setOnClickListener(listener);
        super.setContentView(mView);
    }

    //点击之后消失
    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MsgDialog.this.dismiss();
        }
    };

    /**
     * 确定键监听器
     *
     * @param listener
     */
    public void setOnPositiveListener(View.OnClickListener listener) {
        positiveButton.setOnClickListener(listener);
    }

    /**
     * 取消键监听器
     *
     * @param listener
     */
    public void setOnNegativeListener(View.OnClickListener listener) {
        negativeButton.setOnClickListener(listener);
    }


4.直接使用刚才自定的MsgDialog:

MsgDialog msgDialog = new MsgDialog(this);
        msgDialog.setOnNegativeListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "点击了取消", Toast.LENGTH_SHORT).show();
                msgDialog.dismiss();
            }
        });
        msgDialog.setOnPositiveListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "点击了确定", Toast.LENGTH_SHORT).show();
                msgDialog.dismiss();
            }
        });
        msgDialog.show();
    }



5:现在介绍上面所说的如何控制自定义alertdialog的宽高,在自定的类中加入如下代码,至于宽高自己可以根据需求指定:

 @Override
    public void show() {
        super.show();
        Window dialogWindow = this.getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        /获取屏幕宽度
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);;
        wm.getDefaultDisplay().getMetrics(dm);
        int screenWidth = dm.widthPixels;
        /设置高宽
        lp.width = (int) (screenWidth * 0.75); // 宽度
        lp.height = (int) (lp.width*0.65);     // 高度
        dialogWindow.setAttributes(lp);
    }

6.点击空白处对话框不消失的设置,一定要在show方法之前调用:

 //点击空白处不消失的方法
        msgDialog.setCanceledOnTouchOutside(false);

其实明白了原理就可以定义出自己想要的风格了,小伙伴们赶紧来试一试吧,按着这个顺序写就可以了,没有漏掉一句代码就不上传代码了.





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值