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. SQL查询显示行号、随机查询、取指定行数据

    转自:walkingp 1.显示行号 如果数据没有删除的情况下主键与行号是一致的,但在删除某些数据,行号就与主键不一致了,这时需要查询行号就需要用新的方法,在SQL Server2005之前,需要使用 ...

  2. json、xml ---- 数据格式生成类

    自己写的一个生成json/xml 格式数据的类,可用于api数据传输: <?php class Response{ /** *生成指定数据格式 *@param intval $code 状态码 ...

  3. VNC服务端自动化配置脚本

    在使用阿里云的linux云主机,看到官方提供的远程连接服务器bash脚本,记录下来.       功能:自动修改系统源和安装vncserver相关的软件包,centos.redhat系列都是安装gno ...

  4. Content Providers

    Content providers manage access to a structured set of data. They encapsulate the data, and provide ...

  5. IOS 中得runloop 详细解释

    1.Runloop基础知识- 1.1 字面意思 a 运行循环 b 跑圈 - 1.2 基本作用(作用重大) a 保持程序的持续运行(ios程序为什么能一直活着不会死) b 处理app中的各种事件(比如触 ...

  6. SpringMVC4+thymeleaf3的一个简单实例(篇三:页面参数获取)

    本篇将通过示例介绍页面参数是如何传递到后台的.我们继续沿用之前搭好的程序结构,如果你不知道,请参照前两篇.为方便跳转页面,我们在首页以及zoolist.html页面都加上彼此地址的链接:首页: zoo ...

  7. POJ3285 River Hopscotch(最大化最小值之二分查找)

    POJ3285 River Hopscotch 此题是大白P142页(即POJ2456)的一个变形题,典型的最大化最小值问题. C(x)表示要求的最小距离为X时,此时需要删除的石子.二分枚举X,直到找 ...

  8. ARM架构下linux设备树加载的方法

    引入设备树后bootloader加载DTB方法: 1. 标准方法 将linux kernel放到内存地址为<kernel img addr>的内存中. 将DTB放到地址为<dtb a ...

  9. 如何:在 StackPanel 和 DockPanel 之间进行选择

    虽然可以使用 DockPanel 或 StackPanel 来堆叠子元素,但这两个控件并不总是会产生相同的结果. 例如,子元素的放置顺序可能会影响 DockPanel 中子元素的大小,但不会影响 St ...

  10. 【随记】解决:VS2010 调试器无法继续继续运行该进程,无法启动调试

    今天在调试项目的时候突然出现错误: 按照网上的一些方法弄了后还是同样报错,把本地代码删除后从库上重现拉下来的项目依然报错,到这里就明白不是项目本身问题了,而是VS2010 的问题,经过网上查资料,问同 ...