android里面会有自己内置的Dialog的提示框,也算是比较方便的了,但是为了省点时间,我们在项目里面添加了一个自己的Dialog类,这个类实现了能够动态的添加按钮和一些提示语句或者其他的显示效果。

import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView; public class DialogUnifiedFragment extends DialogFragment {
private View mTitleView; // 标题栏的布局
private View mCloseButton; // 标题栏右上角的关闭按钮
private View mContextView; // 对话框内容的布局
private View mNullButton; // 无按钮对应的View
private View mFristButton; // 第一个按钮对应的View
private View mSecondButton; // 第二个按钮对用的View
private LinearLayout mButtonViewNull; // 无按钮的布局
private LinearLayout mButtonViewFrist; // 第一个按钮的布局
private LinearLayout mButtonView; // Button的布局
private TextView mTextview_content; // 显示对话框内容的TextView
private Context mContext; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(R.style.dialog, R.style.dialog);
setCancelable(false);
} @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return super.onCreateDialog(savedInstanceState);
} @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); } public void addContext(Context mContext) {
this.mContext = mContext;
} /**
* @see android.app.DialogFragment#onAttach(android.app.Activity)
*/
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
mContext = activity;
} /**
* 将对应的“标题”,“内容”,“底部Button”放到Dialog默认布局里
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_common_dialog_layout, container); if (null != mTitleView) {
FrameLayout titleView = (FrameLayout) view.findViewById(R.id.layout_title);
titleView.addView(mTitleView);
if (null != mCloseButton) {
titleView.addView(mCloseButton);
}
} if (null != mContextView) {
LinearLayout contentView = (LinearLayout) view.findViewById(R.id.layout_content);
contentView.addView(mContextView);
}
mButtonViewNull = (LinearLayout) view.findViewById(R.id.layout_button_null);
mButtonViewFrist = (LinearLayout) view.findViewById(R.id.layout_button_frist);
mButtonView = (LinearLayout) view.findViewById(R.id.layout_button);
if (null != mNullButton) {
mButtonViewNull.setVisibility(View.VISIBLE);
}
if (null != mFristButton) {
mButtonView.setVisibility(View.VISIBLE);
mButtonViewFrist.addView(mFristButton);
mButtonViewFrist.setVisibility(View.VISIBLE);
}
LinearLayout buttonViewSecond = (LinearLayout) view.findViewById(R.id.layout_button_second);
if (null != mSecondButton) {
mButtonView.setVisibility(View.VISIBLE);
buttonViewSecond.addView(mSecondButton);
buttonViewSecond.setVisibility(View.VISIBLE);
}
if (null != mSecondButton || null != mFristButton) { }
return view;
} private int height = 0, width = 0; public void setDialogSize(int height, int width) {
this.height = height;
this.width = width; } @Override
public void onResume() {
super.onResume();
// 用于重新设置dialog的大小
if (width != 0 && height != 0) {
getDialog().getWindow().setLayout(width, height);
}
} /**
* 添加标题栏,保存之后返回当前DialogFragment
*
* @param title
* 对话框标题内容
* @return DialogFragment
*/
public DialogUnifiedFragment addTitle(String title) {
mTitleView = LayoutInflater.from(mContext).inflate(R.layout.fragment_dialog_title, null);
TextView title_name = (TextView) mTitleView.findViewById(R.id.dialog_common_tv_title);
title_name.setText(title);
return this;
} @Override
public void setStyle(int style, int theme) {
// TODO Auto-generated method stub
super.setStyle(style, theme);
} /**
* 添加标题栏标题栏右侧的 关闭按钮
*
* @param onClickListener
* @return
*/
public DialogUnifiedFragment addClose(final OnClickListener onClickListener) {
mCloseButton = LayoutInflater.from(mContext).inflate(R.layout.fragment_dialog_title_close, null);
Button close = (Button) mCloseButton.findViewById(R.id.dialog_factory_bt_cancle);
if (null != onClickListener)
close.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
dismissAllowingStateLoss();
if (onClickListener != null) {
onClickListener.onClick(v);
}
}
});
return this;
} /**
* 添加对话框的内容,保存之后返回当前DialogUnifiedFragment
*
* @param content
* 内容
* @return DialogUnifiedFragment
*/
public DialogUnifiedFragment addContent(String content) {
mContextView = LayoutInflater.from(mContext).inflate(R.layout.fragment_dialog_content, null);
mTextview_content = (TextView) mContextView.findViewById(R.id.dialog_common_tv_content);
mTextview_content.setText(content);
return this;
} /**
* 添加对话框ContentView,限制条件如下: 1.仅允许传用于显示的、无点击事件的、无业务逻辑处理的View
* 2.view的格式与R.layout.dialog_content一致 3.使用该方法的Dialog必须有Title
* 4.禁止同时调用addContent(String content)
*
* @param view
* @return
*/
public DialogUnifiedFragment addView(View view) {
if (view != null) {
mContextView = view;
}
return this;
} /**
* 默认内容的TextView的文字“居中” 对升级等对话框,需要显示的文字太多,重新设置文字对齐方式
*/
public void setTextGravity(int gravityType) {
mTextview_content.setGravity(gravityType); } public void setTextSize(int textSize){
mTextview_content.setTextSize(textSize);
} /**
* 一个一个的添加Button
*
* @param whichButton
* 添加的具体是哪个Button
* @param buttonName
* Button要显示的内容
* @param BtnClickListener
* @return DialogUnifiedFragment
*/
public DialogUnifiedFragment addButton(int whichButton, String buttonName, final OnClickListener onClickListener ,final boolean canDismiss) {
switch (whichButton) {
case 0:
mNullButton = LayoutInflater.from(mContext).inflate(R.layout.fragment_dialog_null_button, null);
break;
case 1:
mFristButton = LayoutInflater.from(mContext).inflate(R.layout.fragment_dialog_frist_button, null);
Button frist_button = (Button) mFristButton.findViewById(R.id.dialog_common_bt_frist);
frist_button.setText(buttonName);
frist_button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(canDismiss){
dismissAllowingStateLoss();
}
if (onClickListener != null) {
onClickListener.onClick(v);
}
}
});
mSecondButton = null;
break;
case 2:
mSecondButton = LayoutInflater.from(mContext).inflate(R.layout.fragment_dialog_second_button, null);
Button second_button = (Button) mSecondButton.findViewById(R.id.dialog_common_bt_second);
second_button.setText(buttonName);
second_button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
if(canDismiss){
dismissAllowingStateLoss();
}
if (onClickListener != null) {
onClickListener.onClick(v);
}
}
});
break;
}
return this;
} }

这个类的使用也是比较简单的。我们只要在自己的Activity里面创建并引用改类就可以调用其中的方法了

private DialogUnifiedFragment dialog;
dialog=new DialogUnifiedFragment();
dialog.addContext(getBaseContext());
dialog.setDialogSize(300,300);//设置弹出框的大小
dialog.addTitle("这是一个弹出框!")//设置弹出框的标题
dialog.addClose();//在右上角添加关闭的按钮
dialog.setTextSize(20);//设置弹出框主体文字的大小

首先我们创建一个比较简单的弹出框,就是在弹出框上面添加文字和一个按钮。

dialog.addContent("这是我的弹出框").addButton(1, "确定", new OnClickListener() {
@Override
public void onClick(View v) {//可以在这里添加点击确定按钮的操作。
       
}
}, true);
dialog.show(getFragmentManager(), "dwonloadContract");//在这里将弹出框show出来

其次我们可以动态的添加两个按钮;

dialog.addContent("这是两个按钮的弹出框").addButton(1, "取消", new OnClickListener() {

                    @Override
public void onClick(View v) {
}
}, true).addButton(2, "确定", new OnClickListener() { @Override
public void onClick(View v) { }
}, true);
dialog.show(getFragmentManager(), "hey ,there !");

好了更加自由的功能就是下面这个了,我们可以定义一个view来显示我们想要的效果,然后将改页面加载到我们自定义的dialog上面来。

View uploadSucceed = LayoutInflater.from(context).inflate(R.layout.view_myview, null);
dialog.addView(uploadSucceed).addButton(1,
"关闭", new OnClickListener() {
@Override
public void onClick(View v) {
}, true);
dialog.setDialogSize(400, 600);
dialog.show(getFragmentManager(), "");

当然我不得不说,当你在这个弹出框里面使用了addView的话那么你是不能使用addContent了的,同样如果使用了addContent你就不能用addView了。就酱。

从上面的代码我们看到,这个自定义的类也是继承了原生API里面的DialogFragment .我们可以通过该类的setDialogSize()方法来设置提示框的大小,通过addView去添加我们自己的View,通过addContent去添加弹出框的提示语句,通过addButton去添加按钮。

Android的一个自定义的动态添加Dialog类的更多相关文章

  1. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  2. 如何使用classnames模块库为react动态添加class类样式

    摘要 在react中添加动态的css时,传统的方式较为繁琐,今天刚好学习到一个模块库可以便捷的解决这个问题.对的,它就是“classnames”. classnames模块库 npm安装 npm in ...

  3. [Android] 通过GridView仿微信动态添加本地图片

    原文:http://blog.csdn.net/eastmount/article/details/41808179 前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述 ...

  4. android ListView内数据的动态添加与删除

    main.xml 文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...

  5. DynamicEnumUtil 动态添加枚举类的枚举值

    import java.lang.reflect.AccessibleObject; import java.lang.reflect.Array; import java.lang.reflect. ...

  6. Mono for android 如何动态添加View,线程内部如何更新UI.

    貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...

  7. 关于JFace的自定义对话框(Dialog类)

    仅仅是使用MessageDialog,InputDialog等JFace中现成的对话框类是无法满足实际项目开发需要的. 很多时候都需要自己定制对话框,自定义对话框只要在Dialog类的基础上作扩展就行 ...

  8. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...

  9. 周记4——vue中动态添加图片无效、build上线后background-image路径问题

    又是一个周五,又一周要过去了...很开心,这周遇到了vue中的一个比较常见的坑,网上随便一搜就有了很多解决方案...“幸运”的是,我选了一个带坑的方案...所以我觉得有必要记录一下这个“坑中坑”... ...

随机推荐

  1. warning:This application is modifying the autolayout engine from a background thread

    警告提示:This application is modifying the autolayout engine from a background thread, which can lead to ...

  2. Java中Date各种相关用法

    Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=Calendar.getInstance(); time.clear(); time.set ...

  3. python下载IGS观测数据

    最近在学习GPS数据软件处理,经常需要下载数据练习,反复去网站上很麻烦,于是就写了一个小小的爬虫,用的是韩国的服务器,使用了python中的ftplib库实现的 今天稍微改了一下代码,可以选择卫星系统 ...

  4. Orchard路由随记(一)

    对于Orchard来说,个人以为要真正理解Orchard,必须理解其路由工作方式. 一.Orchard的自定义路由由三种类型组成 1.分发类: HubRoute:其功能是按租户筛选出当前访问租户的路由 ...

  5. 使用Java BigDecimal进行精确运算

    首先我们先来看如下代码示例: public class Test_1 {     public static void main(String[] args) {         System.out ...

  6. EF FluentAPI映射一对多 关系时候报错

    提示很明显,不可为空的外键为空了,但是 问题是,我只是初始化 关系映射而已:见代码 public ColumnsCategoryMapConfiguration() { ToTable("C ...

  7. JS调用android逻辑方法

    1.安卓打开webview时做如下配置 并做一回调接口 这里注意的是 参数 FULIBANG   和 回调接口方法  jsCallWebView 一会在JS里会用到 ================= ...

  8. SGU 224.Little Queens

    时间限制:0.75s 空间限制:6M 题意 n*n(n<=10)的棋盘,求出放置m(m<=n*n)个皇后的方案数. Solution: 状态压缩+位运算  搜索. 首先我们从上往下逐行放置 ...

  9. Windows的命令行怎么支持通配符

    摸索出一个小技巧,虽然Windows的命令行本身不支持通配符,但可以在脚本里把传进来的参数当通配符用 只要加上@ARGV = glob "@ARGV";就行了 @ARGV = gl ...

  10. java中jdk环境配置

    配置java环境,俗称jdk环境 首先进入配置环境的目录下:右键鼠标我的电脑->属性->高级系统设置->环境变量,在对应的"系统变量"框下配置一下变量: 规范的配 ...