在我们项目开发的时候,总是需要使用同一种格式的dialog,但是,每次我们都需要把那一大段一大段的代码复制过去,这无疑是非常不明智的选择,后来,我想为什么我不把那些dialog封装起来当成一个对象,等我们以后需要用到的时候,自己new这个对象,然后实现它的左右键监听不就行了么。以下为运用时的代码:
MyDialog my = new MyDialog(MainActivity.this); my.showDialog("中", "左", "右", new MyDialogCallBack() { public void onRightBtnFun() { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "右", Toast.LENGTH_SHORT).show(); } public void onLeftBtnFun() { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "左", Toast.LENGTH_SHORT).show(); } });
这种做法的优点,毋庸置疑便是使用的时候简便快捷,能够快速的生成dialog。
以下为实现代码:
(1)制作页面布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="120dp" android:layout_gravity="center" android:layout_marginLeft="30dp" android:layout_marginRight="30dp" android:background="@color/white" android:orientation="vertical" > <TextView android:id="@+id/tvmessage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="20dp" android:textColor="@color/dialog_message" android:textSize="16sp" /> <View android:layout_width="fill_parent" android:layout_height="1dp" android:background="@color/dialog_line" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="45dp" android:orientation="horizontal" > <TextView android:id="@+id/tvleft" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/dialog_btn" android:gravity="center" android:textColor="@color/bg" android:textSize="17sp" /> <View android:layout_width="1dp" android:layout_height="fill_parent" android:background="@color/dialog_line" /> <TextView android:id="@+id/tvright" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/dialog_btn" android:gravity="center" android:textColor="@color/bg" android:textSize="17sp" /> </LinearLayout> </LinearLayout>
<style name="MyDialogStyleBottom" parent="android:Theme.Dialog"> <item name="android:windowFrame">@null</item> <!-- 边框 --> <item name="android:windowIsFloating">true</item> <!-- 是否浮现在activity之上 --> <item name="android:windowIsTranslucent">true</item> <!-- 半透明 --> <item name="android:windowNoTitle">true</item> <!-- 无标题 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 背景透明 --> <item name="android:backgroundDimEnabled">true</item> <!-- 模糊 --> </style>
在这里设置了一下
便可以看到下图的效果:
(3)创建MyDialog类,定义以下成员变量并实现其构造方法:
/** 屏幕宽度像素 */ private int width; /** 自定义对话框 */ private MyDialog myDialog; /** 对话框中的内容 */ private TextView tvMessage; /** 对话框中的左键 */ private TextView tvLeft; /** 对话框中的右键 */ private TextView tvRight; /** 显示Dialog的Activity */ private Activity activity; /** 上下文 */ private Context context; /** dialog左右键的回调类 */ private MyDialogCallBack myDialogCallBack;
public MyDialog(Context context) { this(context, R.style.MyDialogStyleBottom); } public MyDialog(Context context, int theme) { super(context, theme); this.activity = (Activity)context; this.context = context; }
/** * 用于实现dialog左右按钮的点击功能 * * @author xiejinxiong * */ public interface MyDialogCallBack { /** * dialog左键功能 */ void onLeftBtnFun(); /** * dialog右键功能 */ void onRightBtnFun(); }
/** * 初始化对话框 * * @param context * @param strMeaasge * @param strLeft * @param strRight */ public void showDialog(String strMeaasge, String strLeft, String strRight, MyDialogCallBack myDialogCallBack) { this.myDialogCallBack = myDialogCallBack; // myDialog = new MyDialog(context); myDialog = this; InitPixels(); initDialogUI(this.context); initDialogInfo(strMeaasge, strLeft, strRight); myDialog.setCanceledOnTouchOutside(false); myDialog.show(); }(5.1)初始化屏幕像素
/** * 初始化屏幕像素 */ public void InitPixels() { DisplayMetrics metric = new DisplayMetrics(); this.activity.getWindowManager().getDefaultDisplay().getMetrics(metric); // height = metric.heightPixels; width = metric.widthPixels; }
/** * 初始化UI */ private void initDialogUI(Context context) { View view = LayoutInflater.from(context).inflate( R.layout.dialog_layout, null, false); initDialogListener(view); Window window = myDialog.getWindow(); window.setContentView(view); WindowManager.LayoutParams p = window.getAttributes(); // 获取对话框当前的参数值 p.height = LayoutParams.WRAP_CONTENT; p.width = (int) (width * 0.8); // 宽度设置为屏幕的0.8 window.setAttributes(p); }
/** * 初始化普通对话框并显示内容 * * @param view */ private void initDialogListener(View view) { // 对话框中的内容 tvMessage = (TextView) view.findViewById(R.id.tvmessage); // 对话框中的左键 tvLeft = (TextView) view.findViewById(R.id.tvleft); tvLeft.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // dialogLeftBtnFunction(); // if (myDialogCallBack != null) { myDialogCallBack.onLeftBtnFun(); // } else { // myDialogCallBackCenter.onCenterBtnFun(); // } myDialog.dismiss(); } }); // 对话框中的右键 tvRight = (TextView) view.findViewById(R.id.tvright); // if (myDialogCallBack != null) { tvRight.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // dialogRightBtnFunction(); myDialogCallBack.onRightBtnFun(); myDialog.dismiss(); } }); // } else { // tvRight.setVisibility(View.GONE); // } }
/** * 设置dialog的信息 * * @param strMeaasge * @param strLeft * @param strRight */ private void initDialogInfo(String strMeaasge, String strLeft, String strRight) { tvMessage.setText(strMeaasge); tvLeft.setText(strLeft); tvRight.setText(strRight); }
/** * 关闭dialog */ public void closeDialog() { if (myDialog != null) { myDialog.dismiss(); } }
但是,在这里突然想到了一个问题,那便是假如我的dialog只有一个按钮怎么办?难道要重新写一个类么,答案当然不是,实现的思路将两个按钮中的其中一个隐藏掉即可。
实现:
(1)另外添加一个用于回调的类:
/** * 用于实现dialog中间键按钮的点击功能 * * @author xiejinxiong * */ public interface MyDialogCallBackCenter { /** * dialog中间键功能 */ void onCenterBtnFun(); }
/** * 初始化对话框(单个按钮) * * @param strMeaasge * @param strCenter * @param myDialogCallBackCenter */ public void showDialog(String strMeaasge, String strCenter, MyDialogCallBackCenter myDialogCallBackCenter) { this.myDialogCallBackCenter = myDialogCallBackCenter; showDialog(strMeaasge, strCenter, "", null); }
/** * 初始化普通对话框并显示内容 * * @param view */ private void initDialogListener(View view) { // 对话框中的内容 tvMessage = (TextView) view.findViewById(R.id.tvmessage); // 对话框中的左键 tvLeft = (TextView) view.findViewById(R.id.tvleft); tvLeft.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // dialogLeftBtnFunction(); if (myDialogCallBack != null) { myDialogCallBack.onLeftBtnFun(); } else { myDialogCallBackCenter.onCenterBtnFun(); } myDialog.dismiss(); } }); // 对话框中的右键 tvRight = (TextView) view.findViewById(R.id.tvright); if (myDialogCallBack != null) { tvRight.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // dialogRightBtnFunction(); myDialogCallBack.onRightBtnFun(); myDialog.dismiss(); } }); } else { tvRight.setVisibility(View.GONE); } }(4)最终以下简单的代码便可以得到另外一种显示效果:
MyDialog my = new MyDialog(MainActivity.this); my.showDialog("内容", "中", new MyDialogCallBackCenter() { public void onCenterBtnFun() { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "中", Toast.LENGTH_SHORT).show(); } });
源码:http://download.csdn.net/detail/u011596810/9009559