自定义可扩性很强的Dialog

在做项目时,很多时候会用的对话框,安卓默认的对话框又太丑了,不能满足我们的需要,下面我就介绍一种自定Dilog

先来看一下效果

可以看到上面分为三个部分,提示部分,中间的内容部分,还有下面两按钮部分。

我把这部分做成可控制的的,一般“提示”这个有需要的也有不需要的,那么不需要时可以隐藏,需要时可以显示

然后中间的这部分是你要提示的信息,这个布局呢也是设置成自定义布局,这个布局中你可以像我一样,只要一个TextView,展示提示信息即可,也可以根据自己的需要添加另外的控件,比如EditText,等,都是在一个布局中设置就ok

下面的按钮部分呢也是自定义的两个按钮布局,分别放在drawable文件加下,这个按钮你可以手动修改他的样式,这里我就用一种了,一会再说怎么修改

好了接下来做中主要的部分,废话不多说上代码

package com.mydialog.widget;

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.graphics.Color;

import android.util.TypedValue;

import android.view.*;

import android.widget.LinearLayout;

import android.widget.LinearLayout.LayoutParams;

import android.widget.TextView;

import com.mydiaolg.activity.R;

/**

* 自定义Dialog

*/

public class CustomDialog {

private Context context;

private AlertDialog ad;

private TextView title;

private LinearLayout titleLayout;

private LinearLayout contentLayout;

private LinearLayout buttonLayout;

public CustomDialog(Context context) {

this.context = context;

ad = new AlertDialog.Builder(context).create();

ad.setCancelable(false);

ad.show();

Window window = ad.getWindow();

window.setContentView(R.layout.custom_dialog);

//设置dialog的宽度

WindowManager.LayoutParams lp = window.getAttributes();

// 获取屏幕宽、高用

Display d = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

lp.width = (int) (d.getWidth() * 0.85);

window.setAttributes(lp);

// 解决AlertDialog弹不出输入法的问题

window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

//初始化控件

title = (TextView) window.findViewById(R.id.reminder_title);

titleLayout = (LinearLayout) window.findViewById(R.id.dialog_title);

contentLayout = (LinearLayout) window.findViewById(R.id.dialog_content);

buttonLayout = (LinearLayout) window.findViewById(R.id.dialog_btn);

}

/**

* 设置title id

*/

public void setTitleName(int resId) {

title.setText(resId);

}

/**

* 设置title 内容

* @param titleName

*/

public void setTitleName(String titleName) {

title.setText(titleName);

}

/**获取titile布局view*/

public TextView getTitleView() {

return title;

}

/**

* 显示或隐藏头部

*

* @param isShow 是否显示头部

*/

public void showTitle(boolean isShow) {

if (isShow) {

titleLayout.setVisibility(View.VISIBLE);

} else {

titleLayout.setVisibility(View.GONE);

}

}

/**

* 设置内容

*

* @param layoutId 布局id

*/

public void setContentView(int layoutId, LayoutParams params) {

LayoutInflater inflaterDl = LayoutInflater.from(context);

View view = inflaterDl.inflate(layoutId, null);

contentLayout.addView(view, params);

contentLayout.setVisibility(View.VISIBLE);

}

/**

* 设置内容

*

* @param view   视图

* @param params 布局参数

*/

public void setContentView(View view, LayoutParams params) {

contentLayout.removeAllViews();

contentLayout.addView(view, params);

contentLayout.setVisibility(View.VISIBLE);

}

public View getContentView() {

return contentLayout;

}

/**

* 设置按钮

*

* @param text     按钮显示文字

* @param resId    按钮背景图片布局

* @param listener 按钮点击事件

*/

public void setButton(String text, int resId, final View.OnClickListener listener) {

TextView button = new TextView(context);

LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,

LayoutParams.WRAP_CONTENT, 1);

button.setLayoutParams(params);

button.setGravity(Gravity.CENTER);

button.setBackgroundResource(resId);

button.setText(text);

button.setTextColor(Color.WHITE);

button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);

button.setOnClickListener(listener);

params.setMargins(dip2px(context, 15), 0, dip2px(context, 15), 0);

button.setLayoutParams(params);

buttonLayout.addView(button);

buttonLayout.setVisibility(View.VISIBLE);

}

/**

* 关闭对话框

*/

public void dismiss() {

ad.dismiss();

}

/**

* 展示对话框

*/

public void show() {

ad.show();

}

/**

* 设置是否可以关闭

*

* @param cancelable true或false

*/

public void setCancelable(boolean cancelable) {

ad.setCancelable(cancelable);

}

/**

* 设置是否可以点击dialog外面关闭dialog

*

* @param canceledOnTouchOutside true或false

*/

public void setCanceledOnTouchOutside(boolean canceledOnTouchOutside) {

ad.setCanceledOnTouchOutside(canceledOnTouchOutside);

}

public static int dip2px(Context context, float dpValue) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (dpValue * scale + 0.5f);

}

/**

* 设置dialog消失事件

*

* @param onDismissListener dialog消失事件

*/

public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {

ad.setOnDismissListener(onDismissListener);

}

}

下面来看下custom_dialog.xml布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical"

android:background="@drawable/bg_dialog"

android:paddingBottom="15dp"

android:paddingTop="15dp">

<LinearLayout

android:id="@+id/dialog_title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginBottom="15dp"

android:orientation="vertical"

android:paddingLeft="15dp"

android:paddingRight="15dp">

<TextView

android:id="@+id/reminder_title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginBottom="10dp"

android:textColor="#ff323232"

android:textSize="22sp" />

<ImageView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:src="@drawable/bg_public_line"

android:contentDescription="@null"

android:scaleType="fitXY" />

</LinearLayout>

<LinearLayout

android:id="@+id/dialog_content"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:orientation="horizontal"

android:paddingLeft="15dp"

android:paddingRight="15dp"

android:visibility="gone" />

<LinearLayout

android:id="@+id/dialog_btn"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:layout_marginTop="15dp"

android:visibility="gone" />

</LinearLayout>

主要的东西就在上面了,下面我们来调用,这里我就把调用过程放在一个方法里

大家可以根据自己需要调用

/**

* 弹出对话框

*/

private  void  showDialog(){

LinearLayout.LayoutParams params = new

LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,

LinearLayout.LayoutParams.WRAP_CONTENT);

LayoutInflater inflater = LayoutInflater.from(MainActivity.this);

View mDialogView = inflater.inflate(R.layout.dialog_public_content, null);

TextView textView = (TextView) mDialogView.findViewById(R.id.my_content_text);

textView.setText("你确定好做XXX事情吗?");

final CustomDialog customDialog = new CustomDialog(MainActivity.this);

customDialog.showTitle(true);

customDialog.setTitleName(R.string.pubilc_dialog_title);

customDialog.setContentView(mDialogView, params);

//取消

customDialog.setButton(getString(R.string.public_cancel),

R.drawable.btn_cancel_selector, new View.OnClickListener() {

@Override

public void onClick(View v) {

customDialog.dismiss();

}

});

//确定

customDialog.setButton(getString(R.string.public_ok),

R.drawable.btn_ok_selector, new View.OnClickListener() {

@Override

public void onClick(View v) {

//确定事件,这里可以监听你要确定的事情,例如提交数据等

customDialog.dismiss();

}

});

}

这里有三个布局dialog_public_content.xml展示你提示的内容信息的,好有就是放在drawable下的btn_cancel_selector.xml,和btn_ok_selector.xml,两个按钮了,

下面来看下dialog_public_content.xml,这个布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:gravity="center_vertical">

<TextView

android:id="@+id/my_content_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#ff333333"

android:textSize="16sp" />

</LinearLayout>

这个TextVIew就是最开始图中看到的“你确定要做XXX 事情吗?”对应的TextVIew,在这个布局中你可以根据自己需要修改布局中的控件,然后调用就ok

这么做为了扩展性,例如我可在这布局中设置EditText,提示用户输入某些信息等

那么btn_cancel_selector.xml,和btn_ok_selector.xml,两个按钮了布局是一样的,只是里面的图片不一样罢了

你可以根据需要写两可以只用一个,好了看下btn_ok_selector.xml中的内容吧

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/bg_btn_ok_press" android:state_pressed="true" />

<item android:drawable="@drawable/bg_btn_ok_normal" />

</selector>

好了大功告成,你可以直接调用了,下面我来调用一下

这个是一个简单的调用过程,大家知道怎么使用就ok了,

部分的资源文件图片什么的放在了drawable-hdip文件夹中,

下面我把Demo的地址给大家,有需要的可以去下载看一下

下载地址是:http://download.csdn.net/detail/shaozucheng/8243089

时间: 2024-10-07 16:46:15

自定义可扩性很强的Dialog的相关文章

可读性很强的C语言的函数指针定义

通常C/C++程序里面要用到大量的指针,其语法非常难以阅读.比如下面的vp指针类型: #include <iostream> using namespace std; typedef void (*vp) (float&,float&); void foo(float &a,float &b) { a = a + b; } int main() { // float a=1; float b=2; vp t=&foo; t(a,b); cout <

生活中走得远的,都是自愈能力很强的人

就像冯仑说过:伟大,都是熬出来的.生活中走得远的,都是自愈能力很强的人. 1918年12月23日深夜,巴黎的某个街角,两辆马车轰然相撞,其中一辆车主随着车身一起翻覆,被压在沉重的钢铁支架下,口袋里滑落一串珍珠项链,刺眼地闪耀在血色中. 这个男人叫亚瑟·卡伯,是当时著名的贵族和工业家,几乎100年后,即便贵族的徽印被时光涤荡,他还有另一个知名的身份:可可·香奈儿的恋人和支持者. 他资助一名不文的香奈儿开办自己的帽子店,从他制作精良的男士服装中汲取灵感运用到女性衣饰,他请巴黎最炙手可热的歌剧演员带上

你的领导工作能力很强,凡事喜欢亲力亲为,平时给你安排的工作很少且指导不多,导致你感觉来了几个月无事可做、没有成长。对此,你怎么办?

例:你的领导工作能力很强,凡事喜欢亲力亲为,平时给你安排的工作很少且指导不多,导致你感觉来了几个月无事可做.没有成长.对此,你怎么办? 结合题干信息,当前要处理的关系是我与领导之间的上下级关系,面临一个核心问题是领导本身能力强,但是却不重视“我”,导致我在工作中无所适从.相信很多考生都是按照这个思维来理解题目,以至于掉入题目的陷阱.这个时候,需要我们跳出学生思维,结合实际去思考.第一,领导本身工作能力强,我们作为下属最直接的反应是什么,应该是很开心的,跟着这样的领导我们也会受到潜移默化的影响,个

Android自定义View(1):对话框-Dialog

Android系统自带的对话框,在很多android 5.0以下系统的手机上,简直目不忍视,所以UI设计基本上都需要自定义对话框,漂亮的对话框五花八门,android如何设计一种简单的自定义对话框呢. 一,Dialog需要注意的问题 android 弹出dialog必须存在所属的activity,不能凭空产生,所以dialog不能在application类里面new,必须在activity onCreate之后new. 1,默认的dialog public Dialog(Context cont

你以为自己很强,其实是圈子太弱!

小白叨一叨:让比你弱,比你小,比你低的人点赞不叫本事,让比你强,比你长,比你高的人点赞才算英雄.在自己固有的范围杰出不算杰出,真正的杰出,往往是超越自己的固有范围和层次的.用郭德纲的话说就是:"不是自己多有本事,主要是同行的衬托." 某高富帅对我说他最近身边好多美女备胎,有些甚至是有夫之妇,平时总会约她出来吃吃喝喝甚至别的.他觉得他的魅力好大.我好奇问:"你是这些美女圈子里面最高富帅的一个?"他说:"认识啊,我当然不是."我又问:"那约

网站使用自定义字体导致打开很慢

今天偶尔看到一个网页打开首页一分钟竟然还没有出来!!! 这还了得,做IT就是强迫症多,非得看看是什么原因,不用说F12跑一圈!! 查找原因,是ttf字体库导致的,一看14M,OMG!! 继续查看源代码分析如下: 百度google,终于发现了一好办法[字蛛],感觉不错,文件可以瞬间小很多,其实原理我觉得很简单,英文就26个字母,中国汉字那么多,字体文件肯定 会很大, -------------------------------华丽的分割线-------------------- [字蛛]只不过是

you-get 一个很强的视频地址抓取工具

来源:https://github.com/soimort/you-get 出自于 Mort Yao 大神之手:http://www.geekgrade.com/geeksheet/soimort/blogs 前言(废话): 前段时间,我因公司需求.所以要去研究如何拿到视屏的播放地址.一般普通的网站的视屏播放地址还是很好拿到的.但是对于优酷,腾讯这样的大型视屏资源站就很难拿到视屏资源了.普通的网站你通过网页就可以直接抓取到视屏的播放地址.但是这些大型就不行,这些网站都是做了防盗链的.就拿优酷来讲

很牛很强的远程桌面管理软件

IIS7远程桌面管理工具(3389.vps.服务器批量管理.批量远程工具)简介: 1.批量管理WIN系列服务器,VPS,电脑. 2.批量导入服务器的IP,端口,账号和密码 3.批量打开N个服务器的远程桌面 4.远程桌面后,远程窗口右上角会出现 服务器备注的信息,如郑州xxx号服务器 5.远程桌面后,不影响任务栏显示.可以及时看其他窗口. 6.自定义远程桌面窗口分辨率 7.定时监测服务器是否正常 8.服务器到期提醒 9.可选择是否加载本地硬盘.硬盘映射 10.可选择是否加载服务器的声音,远程声卡读

分享一个棋力很强的象棋应用和一个强大的开局库

象棋旋风佳佳版(采用的是佳佳引擎,淘宝上买的,花了100块+_+感觉买亏了,在绝杀的情况下经常闪退=_=) 链接:https://pan.baidu.com/s/14rz8NIh11lW7kuCI2DcObw,提取码:yzav 象棋旋风(采用的是旋风引擎,很久之前网上下载的,棋力比佳佳版稍弱,但是我推荐使用这款) 链接:https://pan.baidu.com/s/1A3ZqTCkEWzJpNwmMk3oJeQ,提取码:yuip 开局库(非常丰富的开局库,不仅包含各类常规布局,还包含很多冷门及