Android的一个自定义的动态添加Dialog类
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类的更多相关文章
- Android 在布局容器中动态添加控件
这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...
- 如何使用classnames模块库为react动态添加class类样式
摘要 在react中添加动态的css时,传统的方式较为繁琐,今天刚好学习到一个模块库可以便捷的解决这个问题.对的,它就是“classnames”. classnames模块库 npm安装 npm in ...
- [Android] 通过GridView仿微信动态添加本地图片
原文:http://blog.csdn.net/eastmount/article/details/41808179 前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述 ...
- android ListView内数据的动态添加与删除
main.xml 文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...
- DynamicEnumUtil 动态添加枚举类的枚举值
import java.lang.reflect.AccessibleObject; import java.lang.reflect.Array; import java.lang.reflect. ...
- Mono for android 如何动态添加View,线程内部如何更新UI.
貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...
- 关于JFace的自定义对话框(Dialog类)
仅仅是使用MessageDialog,InputDialog等JFace中现成的对话框类是无法满足实际项目开发需要的. 很多时候都需要自己定制对话框,自定义对话框只要在Dialog类的基础上作扩展就行 ...
- 我的Python学习笔记(四):动态添加属性和方法
一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...
- 周记4——vue中动态添加图片无效、build上线后background-image路径问题
又是一个周五,又一周要过去了...很开心,这周遇到了vue中的一个比较常见的坑,网上随便一搜就有了很多解决方案...“幸运”的是,我选了一个带坑的方案...所以我觉得有必要记录一下这个“坑中坑”... ...
随机推荐
- linux的openfire运行日志配置经历
openfire的日志可以通过/usr/openfire/lib/log4j.xml(与openfire的安装目录有关,我的openfire是安装在/usr/openfire/)的xml配置文件进行设 ...
- C# 内存管理优化畅想----前言
C#语法简洁.优雅,类库丰富,是我最喜爱的计算机语言,没有“之一”.但是,经过深入学习后发现,C#的内存管理,也就是通常所说的垃圾回收(GC)机制,虽然跟其他支持GC的语言相比,已经很优秀了,但与手动 ...
- new Integer(1)和Integer.valueOf(1)的区别
java.lang包中的Integer类是我们比较常用的类,比如以下代码: Integer a=new Integer(1) Integer a=Integer.valueOf(1); 两个都是得到一 ...
- java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...
- WPF FindName()查找命名注册的元素
一.查找xaml中命名注册的元素 <Button x:Name="btn1" Content="显示内容" HorizontalAlignment=&qu ...
- PHP环境搭建所遇到的问题
下午学校的机房搭建PHP组合包appserv开发环境的时候是没有任何问题的,但是到了自己的电脑上以后下砸的32位appserve一直无法正常由浏览器的localhos或者127.0.0.1 进入其ap ...
- Android Camera 流程梳理
毕业已经快两年了,一直没有写博客的习惯,这是第一篇,以后要慢慢养成这个习惯.毕业之后一直在做相机,先简单的梳理下Android Camera的流程. Android Camera 是一个client/ ...
- javascript-图片横向无缝隙滚动
<style type="text/css"> <!-- ul,li,div{margin:0; padding:0; font-size:12px;} #dem ...
- 利用抽象、多态实现无反射的绿色环保ORM框架
最近一直在忙新公司的基础库建设,对系统架构.开发框架及快速开发平台的设计实施都积累了一定的实践经验. 一般的中小型的软件开发公司,如果按照技术储备来衡量软件项目的技术含量的评定依据是可行的.但如果光是 ...
- Python:标准数据类型6种
#!/usr/bin/python3 #python的基本语法和数据类型 #python3中 一行有多个语句,用分号分割(;) print("aaa") ;print(" ...