在开发android项目的过程中,弹出框真的是我们的常见的一种互动式窗体,但是android系统自带的弹出框往往都不能满足我们的需要,大多数的时候需要我们自定义一种更漂亮的窗体来来展示给用户。

接下来是我很久之前用的一个自定义弹出框,记录一下,以便自己日后使用。

0、先来一张效果图

1、先定义个一个继承自dialog的自定义弹框customdialog

import android.app.dialog;
import android.content.context;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
import android.widget.button;
import android.widget.textview;
 
/**
 * 作者 aaron zhao 
 * 时间 2015/9/16 11:21 
 * 名称 customdialog.java 描述
 */
public class customdialog extends dialog {
    /* constructor */
    private customdialog(context context) {
        super(context);
    }
 
    private customdialog(context context, int themeresid) {
        super(context, themeresid);
    }
 
    private customdialog(context context, boolean cancelable, oncancellistener cancellistener) {
        super(context, cancelable, cancellistener);
    }
 
    /* builder */
    public static class builder {
        private textview tvtitle, tvwarning, tvinfo;
        private button btncancel, btnconfirm;
 
        private view mlayout;
        private view.onclicklistener mbuttoncancelclicklistener;
        private view.onclicklistener mbuttonconfirmclicklistener;
 
        private customdialog mdialog;
 
        public builder(context context) {
            mdialog = new customdialog(context, r.style.custom_dialog);
            layoutinflater inflater = (layoutinflater) context.getsystemservice(context.layout_inflater_service);
            // 加载布局文件
            mlayout = inflater.inflate(r.layout.dialog_custom, null, false);
            // 添加布局文件到 dialog
            mdialog.addcontentview(mlayout, new viewgroup.layoutparams(viewgroup.layoutparams.match_parent, viewgroup.layoutparams.wrap_content));
 
            tvtitle = (textview) mlayout.findviewbyid(r.id.tv_title);
            tvwarning = (textview) mlayout.findviewbyid(r.id.tv_warning);
            tvinfo = (textview) mlayout.findviewbyid(r.id.tv_info);
            btncancel = (button) mlayout.findviewbyid(r.id.btn_cancel);
            btnconfirm = (button) mlayout.findviewbyid(r.id.btn_confirm);
        }
 
        /**
         * 设置 dialog 标题
         */
        public builder settitle(string title) {
            tvtitle.settext(title);
            tvtitle.setvisibility(view.visible);
            return this;
        }
 
        /**
         * 设置 warning
         */
        public builder setwarning(string waring) {
            tvwarning.settext(waring);
            if (waring == null || waring.equals("")) {
                tvwarning.setvisibility(view.gone);
            }
            return this;
        }
 
        /**
         * 设置 info
         */
        public builder setinfo(string message) {
            tvinfo.settext(message);
            return this;
        }
 
        /**
         * 设置取消按钮文字和监听
         */
        public builder setbuttoncancel(string text, view.onclicklistener listener) {
            btncancel.settext(text);
            mbuttoncancelclicklistener = listener;
            return this;
        }
 
        /**
         * 设置确认按钮文字和监听
         */
        public builder setbuttonconfirm(string text, view.onclicklistener listener) {
            btnconfirm.settext(text);
            mbuttonconfirmclicklistener = listener;
            return this;
        }
 
        public customdialog create() {
            btncancel.setonclicklistener(new android.view.view.onclicklistener() {
                @override
                public void onclick(view view) {
                    mdialog.dismiss();
                    mbuttoncancelclicklistener.onclick(view);
                }
            });
 
            btnconfirm.setonclicklistener(new android.view.view.onclicklistener() {
                @override
                public void onclick(view view) {
                    mdialog.dismiss();
                    mbuttonconfirmclicklistener.onclick(view);
                }
            });
 
            mdialog.setcontentview(mlayout);
            mdialog.setcancelable(true); 
            mdialog.setcanceledontouchoutside(false); 
            return mdialog;
        }
    }
}

2、定义customdialo布局文件:dialog_custom

<?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:gravity="center"
    android:orientation="vertical">
 
    <linearlayout
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:background="@drawable/rect_s_rounded_white"
        android:orientation="vertical">
 
        <linearlayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margintop="@dimen/margin_10"
            android:layout_marginbottom="@dimen/margin_10"
            android:gravity="center"
            android:orientation="vertical">
 
            <textview
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textsize="@dimen/size_18"
                android:textstyle="bold" />
        </linearlayout>
 
        <linearlayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="@dimen/padding_10">
 
            <textview
                android:id="@+id/tv_warning"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textcolor="@android:color/holo_red_dark"
                android:textsize="@dimen/size_14" />
 
            <textview
                android:id="@+id/tv_info"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margintop="@dimen/margin_10"
                android:textcolor="@android:color/black"
                android:textsize="@dimen/size_14" />
        </linearlayout>
 
        <linearlayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margintop="@dimen/margin_10"
            android:layout_marginbottom="@dimen/margin_10"
            android:gravity="center"
            android:orientation="horizontal"
            android:padding="@dimen/padding_10">
 
            <button
                android:id="@+id/btn_cancel"
                android:layout_width="110dp"
                android:layout_height="40dp"
                android:layout_marginright="25dp"
                android:background="@drawable/button_gray_l_rounded_selector"
                android:textcolor="@android:color/black"
                android:textsize="@dimen/size_14" />
 
            <button
                android:id="@+id/btn_confirm"
                android:layout_width="110dp"
                android:layout_height="40dp"
                android:background="@drawable/button_green_l_rounded_selector"
                android:textcolor="@android:color/white"
                android:textsize="@dimen/size_14" />
        </linearlayout>
    </linearlayout>
 
</linearlayout>

3、定义customdialog样式文件:custom_dialog

<style name="custom_dialog" parent="@android:style/theme.dialog">
        <item name="android:windowframe">@null</item>
        <item name="android:windowisfloating">true</item>
        <item name="android:windowistranslucent">true</item>
        <item name="android:windownotitle">true</item>
        <item name="android:background">#00000000</item>
        <item name="android:windowbackground">@color/transparent</item>
        <item name="android:backgrounddimenabled">true</item>
</style>

4、定义其中按钮样式:button_green_l_rounded_selector和button_gray_l_rounded_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <stroke android:color="@android:color/transparent" android:width="0dp"></stroke>
 
            <gradient android:angle="180"
                android:endcolor="@color/button_green"
                android:startcolor="@color/button_green"></gradient>
 
            <corners android:radius="50dp"></corners>
        </shape>
    </item>
 
    <item android:state_focused="true">
        <shape android:shape="rectangle">
            <stroke android:color="@android:color/transparent" android:width="0dp"></stroke>
 
            <gradient android:angle="180"
                android:endcolor="@color/button_green"
                android:startcolor="@color/button_green"></gradient>
 
            <corners android:radius="50dp"></corners>
        </shape>
    </item>
 
    <item android:state_pressed="false">
        <shape android:shape="rectangle">
            <stroke android:color="@android:color/transparent" android:width="0dp"></stroke>
 
            <gradient android:angle="0"
                android:endcolor="@color/button_green"
                android:startcolor="@color/button_green"></gradient>
 
            <corners android:radius="50dp"></corners>
        </shape>
    </item>
 
    <item android:state_focused="false">
        <shape android:shape="rectangle">
            <stroke android:color="@android:color/transparent" android:width="0dp"></stroke>
 
            <gradient android:angle="0"
                android:endcolor="@color/button_green"
                android:startcolor="@color/button_green"></gradient>
 
            <corners android:radius="50dp"></corners>
        </shape>
    </item>
 
</selector>

5、具体使用

private void showdialog() {
        onclicklistener oncancelclicklistener = new onclicklistener() {            
            @override
            public void onclick(view v) {
                mydialog.showtoast(warehouseaddactivity.this, "取消");
            }
        };
        
        onclicklistener onconfimclicklistener = new onclicklistener() {            
            @override
            public void onclick(view v) {
                mydialog.showtoast(warehouseaddactivity.this, "确认");
            }
        };
        
        showinfodialog("", "请点击确认进行操作", "取消", oncancelclicklistener, "确认", onconfimclicklistener);
    }
 
protected void showinfodialog(string waring, string info, string canceltext, onclicklistener cancelonclick, string confirmtext,
            onclicklistener confirmonclick) {
        customdialog.builder builder = new customdialog.builder(this);
        builder.settitle("提示");
        builder.setwarning(waring);
        builder.setinfo(info);
        builder.setbuttoncancel(canceltext, cancelonclick);
        builder.setbuttonconfirm(confirmtext, confirmonclick);
 
        customdialog customdialog = builder.create();
        customdialog.show();
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。