Android自定义弹出框的方法

在开发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();
    }

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

时间: 2022-06-20

Android中自定义PopupWindow实现弹出框并带有动画效果

使用PopupWindow来实现弹出框,并且带有动画效果 首先自定义PopupWindow public class LostPopupWindow extends PopupWindow { public Lost lost; public void onLost(Lost lost){ this.lost = lost; } private View conentView; public View getConentView() { return conentView; } public L

android自定义弹出框样式的实现方法

前言: 做项目时,感觉android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个. 废话不说先上图片: 实现机制 1.先自定义一个弹出框的样式 2.自己实现CustomDialog类,继承自Dialog,实现里面方法,在里面加载自定义样式的弹出框: 3.使用时,与使用Dialog一样 具体代码 dialog_normal_layout.xml样式文件 <?xml version="1.0" encoding="utf-8"?>

Android仿微信进度弹出框的实现方法

MainActivity: package com.ruru.dialogproject; import android.app.Activity; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity implements Runnable { LoadingDialog dialog; @Override protected void onCreate(Bu

Android实现可输入数据的弹出框

之前一篇文章,介绍了如何定义从屏幕底部弹出PopupWindow即<Android Animation实战之屏幕底部弹出PopupWindow>,写完之后,突然想起之前写过自定义内容显示的弹出框,就随手写了两个实例,分享出来: 第一种实现方式:继承Dialog  1.1 线定义弹出框要显示的内容:create_user_dialog.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa

Android编程实现仿QQ发表说说,上传照片及弹出框效果【附demo源码下载】

本文实例讲述了Android编程实现仿QQ发表说说,上传照片及弹出框效果.分享给大家供大家参考,具体如下: 代码很简单,主要就是几个动画而已,图标什么的就随便找了几个,效果图:   动画说明: 1.点击右上角按钮,菜单从顶部下拉弹出,同时背景变暗; 2.再次点击右上角按钮,点击返回键,或者点击空白区域(也就是变暗的部分),菜单向上收回; 3.点击菜单上的按钮响应事件,同时菜单收回(效果同2) 重要说明:动画结束后必须clearAnimation,否则隐藏状态的view依然能响应点击事件 主体代码

Android使用Dialog风格弹出框的Activity

在Android中经常会遇到需要使用Dialog风格弹出框的activity,首先我们可能会首先想到的是在XML布局文件中设置android:layout_height="wrap_content"属性,让activity的高度自适应,显然这还不行,我们还需要为其DialogActivity设置自定义一个样式 <style name="dialogstyle"> <!--设置dialog的背景--> <item name="a

react-native 封装选择弹出框示例(试用ios&android)

在开发 App 的时候,经常会使用到对话框(又叫消息框.提示框.告警框). 在web开发中经常会用得到.今天就来介绍了一下react-native 封装弹出框 之前看到react-native-image-picker中自带了一个选择器,可以选择拍照还是图库,但我们的项目中有多处用到这个选择弹出框,所以就自己写了一下,最最重要的是ios和Android通用.先上动态效果图~ 一.封装要点 1.使用动画实现弹框布局及显示隐藏效果 2.通过一个boolean值控制组件的显示隐藏 3.弹框选项数组通过

Android 多种简单的弹出框样式设置代码

简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 项目地址:http://www.github.com/jjdxmashl/jjdxm_dialogui 特性 1.使用链式开发代码简洁明了 2.所有的弹出框样式都在DialogUIUtils这个类中完成,方便查阅方法 3.可以自定义弹出框字体样式 4.简单的类似加载框的样式可以支持两种主题更改默认白色和灰色 截图 demo下载 demo apk下载 D

Android 仿微信朋友圈点赞和评论弹出框功能

贡献/下载源码:https://github.com/mmlovesyy/PopupWindowDemo 本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多"按钮,弹出对话框: 点击评论,弹出输入框,添加评论并在页面中实时显示: 微信朋友圈点赞和评论功能 2. 实际效果 本文将建一个 ListView,在其 Item 中简单模仿微信的布局,然后着重实现

高仿IOS的Android弹出框

先看一下效果图,不过这是网上的图片. 效果不错,就借此拿来与大伙分享分享. github源码地址:https://github.com/saiwu-bigkoo/Android-AlertView. 1.怎么用:添加依赖. compile 'com.bigkoo:alertview:1.0.3' 2.实例demo(大家可以根据需要来选择自己需要的框框). package com.example.my.androidalertview; import android.app.Activity; i

Android编程实现仿易信精美弹出框效果【附demo源码下载】

本文实例讲述了Android编程实现仿易信精美弹出框效果.分享给大家供大家参考,具体如下: 截图: 动画效果介绍: 1.点击ActionBar上"+"按钮,菜单从上方弹出(带反弹效果): 2.再次点击"+".点击空白区域或者点击返回键,菜单向上方收起: 3.点击弹出框上的按钮时,该按钮放大,其它按钮缩小,菜单整体渐变退出. 主体代码: 1.Activity. /** * 仿易信动画弹出框 */ public class MainActivity extends Ac

Android仿淘口令复制弹出框功能(简答版)

上篇文章给大家介绍了Android实现打开手机淘宝并自动识别淘宝口令弹出商品信息功能,接下来通过本文给大家分享android简单版仿淘口令复制弹出框功能,希望对大家有所帮助! 使用Android系统的粘贴板管理服务及ClipboardManager通过addPrimaryClipChangedListener添加Listener来监听粘贴板的状态,很很简单的一个小功能~ 1.首先创建一个Service在后台运行: Intent intent = new Intent(this,MainServi

详谈iOS 位置权限弹出框闪现的问题

当编码如下的时候,进入页面的时候可以看到UIAlertView弹出框出现一下,刚想点击的时候,他不见了,这个郁闷 CLLocationManager* _locationManager = [[CLLocationManager alloc] init]; _locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; if ([[UIDevice currentDevice].systemVersion floatVal

iOS自定义提示弹出框实现类似UIAlertView的效果

首先来看看实现的效果图 下面话不多说,以下是实现的示例代码 #import <UIKit/UIKit.h> typedef void(^AlertResult)(NSInteger index); @interface XLAlertView : UIView @property (nonatomic,copy) AlertResult resultIndex; - (instancetype)initWithTitle:(NSString *)title message:(NSString

PopupWindow仿微信浮层弹出框效果

最近公司项目需要实现类似微信的浮层弹出框.研究发现是用PopupWindow实现的.而且可以自定义位置以及出现和退出时的动画,由于太晚了就不实现动画了,需要得同学请自己研究下.由于本人新手其中的不足和缺点请见谅. 代码如下: 首先是定义顶部按钮的main.xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an

Android自定义view仿iOS弹出框效果

本文实例为大家分享了Android自定义view仿iOS弹出框的具体代码,供大家参考,具体内容如下 运行效果图 自定义对话框的使用,仿照ios.从底部弹出,类似pop窗口.包括消息.图片.列表及对话框. 好了,用法都会,直接贴上代码 1.layout布局文件 view_actionsheet.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht

Android仿QQ长按删除弹出框功能示例

废话不说,先看一下效果图,如果大家感觉不错,请参考实现代码: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用多个TextView更好一点. 我封装了一下,只需要一个P

Android仿QQ长按弹出删除复制框

本文实例为大家分享了Android仿QQ长按删除弹出框的具体代码,供大家参考,具体内容如下 废话不说,先看一下效果图: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用