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中的一个比较常见的坑,网上随便一搜就有了很多解决方案...“幸运”的是,我选了一个带坑的方案...所以我觉得有必要记录一下这个“坑中坑”... ...
随机推荐
- U3D 内置对象
在U3D里面提供了一个Time对象: void OnGUI(){ Debug.Log("########################"); GUILayout.Label (& ...
- GridView 无数据时,绑定提示
private void BindData() { DataTable dt = DAO.RunSQLReturnDt(this.getsql()); int dtcount = dt.Rows.Co ...
- Dictionary的遍历和修改
/// <summary> /// 初始化一个Dic /// </summary> public static void mainTe ...
- 分享最近写的一个存储过程 SOLVE_LOCK
CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句V_SQL02 VARCHA ...
- 在C语言中使用scanf语句时遇到的问题总结
在使用visual studio2013编写c语言代码时,遇到了这样的几个小问题,进行如下的总结. 1, 关于使用scanf语句报错的解决方案1 #include <stdio.h> in ...
- JavaScript Window Screen
window.screen 对象包含有关用户屏幕的信息. Window Screen window.screen对象在编写时可以不使用 window 这个前缀. 一些属性: screen.availW ...
- Visual Studio2010 安装msdn
1.注册VS2010 断网(不要冒险)->运行Microsoft Visual Studio 2010->帮助->注册产品->YCFHQ-9DWCY-DKV88-T2TMH-G ...
- Spring 实例化bean的方式
实例化bean的方式有三种: 1.用构造器来实例化 2.使用静态工厂方法实例化 3.使用实例工厂方法实例化 当采用构造器来创建bean实例时,Spring对class并没有特殊的要求, 我们通常使用的 ...
- SGU 165.Basketball
题意 输入n个在[1.95,2.05]范围内的数. 保证他们的平均数为2.00. 现在要求把这些数调整出一个顺序, 使得任意长度为K的子段和与2.00* ...
- POJ 2112.Optimal Milking (最大流)
时间限制:2s 空间限制:30M 题意: 有K台挤奶机(编号1~K),C头奶牛(编号K+1~K+C),给出各点之间距离.现在要让C头奶牛到挤奶机去挤奶,每台挤奶机只能处理M头奶牛,求使所走路程最远的奶 ...