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去添加按钮。