常用Android对话框的封装

来源:互联网 发布:unity3d海底场景demo 编辑:程序博客网 时间:2024/05/16 23:41

休息无聊,封装了下android常用的对话框,贴到网上方便大家使用,先看下效果图:

    

     简单确定框          简单信息框          三按钮对话框

     

       单选框              多选框             列表选择框


   

     时间选择框          日期选择框          进度条对话框

下面编写主要代码,比较简单,点击对话框按钮时会相应回调函数,在回调函数中处理对应的逻辑。此处也可以直接传入监听器,在监听器中编写业务逻辑。

此处我们用第一种方法。

首先,编写回调函数接口:

public interface Callback {// 确定按钮回调函数public void onPositiveButton();// 中间按钮回调函数public void onNeutralButton();// 取消按钮回调函数public void onNegativeButton();// 参数中获得相应返回值public void onGetReturnValue(ArrayList<Object> ReturnValues);}

接下来编写对话框类,包含各类对话框:

public class DialogManager{private Context mContext = null;private int mSingleChoiceID = -1;private Dialog mDialog = null;private ProgressDialog mProgressDialog = null;private ArrayList<Integer> MultiChoiceID = null;private ArrayList<Object> returnValues = null;private int mYear = 0;private int mMonth = 0;private int mDay = 0;private int mHour = 0;private int mMinute = 0;public DialogManager(Context context){this.mContext = context;}/** * 简单确定对话框 * @param title * @param msg * @param btnPositiveName * @param isCancelable * @param callback * @return */public Dialog showConfirmDialog(String title,String msg,String btnPositiveName,boolean isCancelable,final Callback callback){AlertDialog.Builder builder = new Builder(mContext);builder.setTitle(title);builder.setMessage(msg);builder.setCancelable(isCancelable);builder.setPositiveButton(btnPositiveName, new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){callback.onPositiveButton();mDialog.dismiss();}});mDialog = builder.create();mDialog.show();return mDialog;}/** * 简单信息提示框 * @param title * @param msg * @param btnPositiveName * @param btnNegativeName * @param isCancelable * @param callback * @return * @author Jacky */public Dialog showMsgDialog(String title,String msg,String btnPositiveName,String btnNegativeName,boolean isCancelable,final Callback callback){AlertDialog.Builder builder = new Builder(mContext);builder.setTitle(title);builder.setMessage(msg);builder.setCancelable(isCancelable);builder.setPositiveButton(btnPositiveName, new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){callback.onPositiveButton();mDialog.dismiss();}});// 取消builder.setNegativeButton(btnNegativeName, new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){callback.onNegativeButton();mDialog.dismiss();}});mDialog = builder.create();mDialog.show();return mDialog;}/** * 有三个按钮的对话框 * @param title * @param msg * @param btnPositiveName * @param btnNeutralName * @param btnNegativeName * @param isCancelable * @param callback * @return * @author Jacky */public Dialog showThreeBtnDialog(String title,String msg,String btnPositiveName,String btnNeutralName,String btnNegativeName,boolean isCancelable,final Callback callback){AlertDialog.Builder builder = new Builder(mContext);builder.setTitle(title);builder.setMessage(msg);builder.setCancelable(isCancelable);// 左侧按钮builder.setPositiveButton(btnPositiveName, new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){callback.onPositiveButton();mDialog.dismiss();}});// 中间按钮builder.setNeutralButton(btnNeutralName, new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {callback.onNeutralButton();mDialog.dismiss();}});// 右侧按钮builder.setNegativeButton(btnNegativeName, new OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){callback.onNegativeButton();mDialog.dismiss();}});mDialog = builder.create();mDialog.show();return mDialog;}/** * 单项选择框 * @param title * @param mItems * @param btnPositiveName * @param btnNegativeName * @param isCancelable * @param callback * @return * @author Jacky */public Dialog showSingleChoiceDialog(String title,final String[] mItems,String btnPositiveName,String btnNegativeName,boolean isCancelable,final Callback callback){        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);                builder.setTitle(title);        builder.setCancelable(isCancelable);        builder.setSingleChoiceItems(mItems, 0, new DialogInterface.OnClickListener()         {        public void onClick(DialogInterface dialog, int whichButton)        {        mSingleChoiceID = whichButton;            }        });        builder.setPositiveButton(btnPositiveName, new DialogInterface.OnClickListener()         {        public void onClick(DialogInterface dialog, int whichButton)        {        returnValues = new ArrayList<Object>();        returnValues.add(mItems[mSingleChoiceID]);        callback.onGetReturnValue(returnValues);        mDialog.dismiss();            }        });        builder.setNegativeButton(btnNegativeName, new DialogInterface.OnClickListener()        {        public void onClick(DialogInterface dialog, int whichButton)        {        callback.onNegativeButton();        mDialog.dismiss();            }        });        mDialog = builder.create();        mDialog.show();                return mDialog;}/** * 列表选择框 * @param title * @param mItems * @param isCancelable * @param callback * @return * @author Jacky */public Dialog showListDialog(String title,final String[] mItems,boolean isCancelable,final Callback callback){        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);                builder.setTitle(title);        builder.setCancelable(isCancelable);        builder.setItems(mItems, new DialogInterface.OnClickListener()         {            public void onClick(DialogInterface dialog, int which)             {        returnValues = new ArrayList<Object>();        returnValues.add(mItems[which]);        callback.onGetReturnValue(returnValues);        mDialog.dismiss();            }        });        mDialog = builder.create();        mDialog.show();                return mDialog;}/** * 多选对话框 * @param title * @param mItems * @param btnPositiveName * @param btnNegativeName * @param isCancelable * @param callback * @return * @author Jacky */public Dialog showMultiChoiceDialog(String title,final String[] mItems,String btnPositiveName,String btnNegativeName,boolean isCancelable,final Callback callback){MultiChoiceID = new ArrayList<Integer>();        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);                builder.setTitle(title);        builder.setCancelable(isCancelable);        builder.setMultiChoiceItems(mItems,                    new boolean[mItems.length],                    new DialogInterface.OnMultiChoiceClickListener()         {                        public void onClick(DialogInterface dialog, int whichButton, boolean isChecked)                        {                           if(isChecked)                           {                               MultiChoiceID.add(whichButton);                           }                           else                            {                           /*ArrayList 的 remove() 函数有两个重载版本,一个参数为要删除的位置,一个参数为要删除的对象                            * 此处若不提示系统调用的参数为对象时,有有时调用另一个版本,可能会导致越界错误,要注意*/                               MultiChoiceID.remove((Integer)whichButton);                           }                                                    }                    });        builder.setPositiveButton(btnPositiveName, new DialogInterface.OnClickListener()         {        public void onClick(DialogInterface dialog, int whichButton)         {        returnValues = new ArrayList<Object>();                int size = MultiChoiceID.size();                for (int i = 0 ;i < size; i++)                {                returnValues.add(mItems[MultiChoiceID.get(i)]);                }                callback.onGetReturnValue(returnValues);                                mDialog.dismiss();            }        });        builder.setNegativeButton(btnNegativeName, new DialogInterface.OnClickListener()        {        public void onClick(DialogInterface dialog, int whichButton)            {        callback.onNegativeButton();        mDialog.dismiss();            }        });        mDialog = builder.create();        mDialog.show();                   return mDialog;}/** * 显示进度条对话框 * @param title * @param msg * @param btnName * @param isCancelable * @param callback * @return * @author Jacky */public ProgressDialog showProgressDialog(String title,String msg,String btnNegativeName,boolean isCancelable,final Callback callback){ mProgressDialog = new ProgressDialog(mContext); mProgressDialog.setTitle(title); mProgressDialog.setMessage(msg); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(isCancelable); mProgressDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, btnNegativeName, new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which){callback.onNegativeButton();mProgressDialog.dismiss();}});mProgressDialog.show(); return mProgressDialog;}/** * 日期选择提示框 * @param title * @param year * @param month * @param day * @param btnPositiveName * @param btnNegativeName * @param isCancelable * @param callback * @return * @author Jacky */public DatePickerDialog showDatePickerDialog(String title,String btnPositiveName,String btnNegativeName,boolean isCancelable,final Callback callback){Calendar mCalendar = Calendar.getInstance();final DatePickerDialog mDatePickerDialog = new DatePickerDialog(mContext,new OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth){returnValues = new ArrayList<Object>();returnValues.add(format(year));returnValues.add(format(monthOfYear + 1));returnValues.add(format(dayOfMonth));callback.onGetReturnValue(returnValues);}}, mCalendar.get(mCalendar.YEAR),mCalendar.get(mCalendar.MONTH),mCalendar.get(mCalendar.DAY_OF_MONTH));mDatePickerDialog.setTitle(title);mDatePickerDialog.setCancelable(isCancelable);mDatePickerDialog.show();return mDatePickerDialog;}/** * 时间选择对话框 * @param title * @param hour * @param minute * @param is24Hour * @param btnPositiveName * @param btnNegativeName * @param isCancelable * @param callback * @return * @author Jacky */public TimePickerDialog showTimerPickerDialog(String title,int paramHour,int prarmMinute,boolean is24Hour,String btnPositiveName,String btnNegativeName,boolean isCancelable,final Callback callback){final TimePickerDialog mTimerPickerDialog = new TimePickerDialog(mContext, new OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hourOfDay, int minute) {returnValues = new ArrayList<Object>();returnValues.add(format(hourOfDay));returnValues.add(format(minute));callback.onGetReturnValue(returnValues);}}, paramHour, prarmMinute, is24Hour);mTimerPickerDialog.setTitle(title);mTimerPickerDialog.setCancelable(isCancelable);mTimerPickerDialog.show();return mTimerPickerDialog;}/** * 转换日期时间格式 * @param original * @return */private String format(int original){String str = "" + original;if(1 == str.length()){str = "0" + str;}return str;}}
最后,在activity主线程中处理业务逻辑。也可以将回调函数放在其他的类中:

public class MainActivity extends Activity {private Button mConfirmDialogBtn = null;private Button mMsgDialogBtn = null;private Button mProgressDialogBtn = null;private Button mThreeBtnDialogBtn = null;private Button mSingleChoiceDialogBtn = null;private Button mMultiChoiceDialogBtn = null;private Button mListDialogBtn = null;private Button mDatePickerDialogBtn = null;private Button mTimePickerDialogBtn = null;private Button mCustomDialogBtn = null;private DialogManager mDialogManager = null;private Dialog mMsgDialog = null;private Dialog mConfirmDialog = null;private Dialog mThreeBtnDialog = null;private Dialog mSingleChoiceDialog = null;private Dialog mListDialog = null;private Dialog mMultiChoiceDialog = null;private ProgressDialog mProgressDialog = null;private DatePickerDialog mDatePickerDialog = null;private TimePickerDialog mTimePickerDialog = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mDialogManager = new DialogManager(MainActivity.this);mConfirmDialogBtn = (Button) findViewById(R.id.confirmDialogBtn);mMsgDialogBtn = (Button) findViewById(R.id.msgDialogBtn);mThreeBtnDialogBtn = (Button) findViewById(R.id.ThreeBtnDialogBtn);mSingleChoiceDialogBtn = (Button) findViewById(R.id.SingleChoiceDialogBtn);mMultiChoiceDialogBtn = (Button) findViewById(R.id.MultiChoiceDialogBtn);mListDialogBtn = (Button) findViewById(R.id.ListDialogBtn);mProgressDialogBtn = (Button) findViewById(R.id.progressDialogBtn);mDatePickerDialogBtn = (Button) findViewById(R.id.DatePickerDialogBtn);mTimePickerDialogBtn = (Button) findViewById(R.id.TimePickerDialogBtn);mCustomDialogBtn = (Button) findViewById(R.id.confirmDialogBtn);/*简单确定框*/mConfirmDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {mConfirmDialog = mDialogManager.showConfirmDialog("提示", "简单确定框", "确定", true, new MyConfirmDialogCallback());}});///*简单信息框*/mMsgDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {mMsgDialog = mDialogManager.showMsgDialog("提示", "简单信息框", "确定", "取消", true, new MyMsgDialogCallback()); }});/*三按钮对话框*/mThreeBtnDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {mThreeBtnDialog = mDialogManager.showThreeBtnDialog("提示", "请选择", "确定", "中立", "取消", true, new MyThreeBtnDialogCallback());}});/*单选对话框*/mSingleChoiceDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {String[] mItems = new String[]{"关羽", "赵云", "张飞", "马超" ,"黄忠"};mSingleChoiceDialog = mDialogManager.showSingleChoiceDialog("提示", mItems, "确定", "取消", true, new MySingleChoiceDialogCallback());}});/*多选对话框*/mMultiChoiceDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {String[] mItems = new String[]{"关羽", "赵云", "张飞", "马超" ,"黄忠"};mMultiChoiceDialog = mDialogManager.showMultiChoiceDialog("提示", mItems, "确定", "取消", true, new MyMultiChoiceDialogCallback());}});/*列表对话框*/mListDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {String[] mItems = new String[]{"关羽", "赵云", "张飞", "马超" ,"黄忠"};mListDialog = mDialogManager.showListDialog("提示", mItems, true, new MyListDialogCallback());}});/*进度条对话框*/mProgressDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View view) {mProgressDialog = mDialogManager.showProgressDialog("进度条提示框", "可以点击取消", "取消", true, new MyProgressCallback());mProgressDialog.setMax(100);new Thread(new Runnable(){int progress = 0;@Overridepublic void run(){for (;progress <= 100; progress += 10){Message msg = new Message();msg.what = 0x0001;msg.obj = progress;mHandler.sendMessage(msg);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}});/*日期对话框*/mDatePickerDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {mDatePickerDialog = mDialogManager.showDatePickerDialog("设置日期", "设置", "取消", true, new MyDatePickerDialogCallback());}});/*时间对话框*/mTimePickerDialogBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {mTimePickerDialog = mDialogManager.showTimerPickerDialog("设置时间", 00, 00, true, "设置", "取消", true, new MyTimePickerDialogCallback());}});///*自定义对话框*///mCustomDialogBtn.setOnClickListener(new OnClickListener() //{//@Override//public void onClick(View v) //{//}//});}Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch(msg.what){case 0x0001:mProgressDialog.setProgress((Integer)msg.obj);break;default:}}};/*定义简单信息对话框回调函数*/class MyMsgDialogCallback implements Callback{@Overridepublic void onPositiveButton() {Toast.makeText(getApplicationContext(), "您点击了确定", Toast.LENGTH_LONG).show();}@Overridepublic void onNeutralButton(){}@Overridepublic void onNegativeButton(){Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues){}}/*定义简单确定对话框回调函数*/class MyConfirmDialogCallback implements Callback{@Overridepublic void onPositiveButton() {Toast.makeText(getApplicationContext(), "您点击了确定", Toast.LENGTH_LONG).show();}@Overridepublic void onNeutralButton() {}@Overridepublic void onNegativeButton() {}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues) {}}/*定义三按钮对话框回调函数*/class MyThreeBtnDialogCallback implements Callback{@Overridepublic void onPositiveButton() {Toast.makeText(getApplicationContext(), "您点击了确定", Toast.LENGTH_LONG).show();}@Overridepublic void onNeutralButton(){Toast.makeText(getApplicationContext(), "您点击了中立", Toast.LENGTH_LONG).show();}@Overridepublic void onNegativeButton(){Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues){}}/*定义单选对话框回调函数*/class MySingleChoiceDialogCallback implements Callback{@Overridepublic void onPositiveButton() {Toast.makeText(getApplicationContext(), "您点击了确定", Toast.LENGTH_LONG).show();}@Overridepublic void onNeutralButton(){}@Overridepublic void onNegativeButton(){Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues){String returnValue = (String) ReturnValues.get(0);Toast.makeText(getApplicationContext(), returnValue, Toast.LENGTH_LONG).show();}}/*定义多选对话框回调函数*/class MyMultiChoiceDialogCallback implements Callback{@Overridepublic void onPositiveButton() {Toast.makeText(getApplicationContext(), "您点击了确定", Toast.LENGTH_LONG).show();}@Overridepublic void onNeutralButton(){}@Overridepublic void onNegativeButton(){Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues){int count = ReturnValues.size();String strReturnValue = ""; for (int i = 0; i < count - 1; i++){strReturnValue += ReturnValues.get(i) + "\n";}strReturnValue += ReturnValues.get(count - 1);Toast.makeText(getApplicationContext(), strReturnValue, Toast.LENGTH_LONG).show();}}/*定义列表对话框回调函数*/class MyListDialogCallback implements Callback{@Overridepublic void onPositiveButton() {}@Overridepublic void onNeutralButton(){}@Overridepublic void onNegativeButton(){}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues){String returnValue = (String) ReturnValues.get(0);Toast.makeText(getApplicationContext(), returnValue, Toast.LENGTH_LONG).show();}}/*定义进度条对话框回调函数*/class MyProgressCallback implements Callback{@Overridepublic void onPositiveButton(){}@Overridepublic void onNeutralButton() {}@Overridepublic void onNegativeButton() {Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues){}}/*定义日期对话框回调函数*/class MyDatePickerDialogCallback implements Callback{@Overridepublic void onPositiveButton() {}@Overridepublic void onNeutralButton() {}@Overridepublic void onNegativeButton() {Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues) {int count = ReturnValues.size();String strReturnValue = ""; for (int i = 0; i < count - 1; i++){strReturnValue += ReturnValues.get(i) + "-";}strReturnValue += ReturnValues.get(count - 1);Toast.makeText(getApplicationContext(), strReturnValue, Toast.LENGTH_LONG).show();}}/*定义时间对话框回调函数*/class MyTimePickerDialogCallback implements Callback{@Overridepublic void onPositiveButton() {}@Overridepublic void onNeutralButton() {}@Overridepublic void onNegativeButton() {Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues) {int count = ReturnValues.size();String strReturnValue = ""; for (int i = 0; i < count - 1; i++){strReturnValue += ReturnValues.get(i) + ":";}strReturnValue += ReturnValues.get(count - 1);Toast.makeText(getApplicationContext(), strReturnValue, Toast.LENGTH_LONG).show();}}/*自定义对话框回调函数*/class MyCustomDialogCallback implements Callback{@Overridepublic void onPositiveButton() {}@Overridepublic void onNeutralButton() {}@Overridepublic void onNegativeButton() {Toast.makeText(getApplicationContext(), "您点击了取消", Toast.LENGTH_LONG).show();}@Overridepublic void onGetReturnValue(ArrayList<Object> ReturnValues) {}}}
代码比较简单,可以根据需要自行修改,但注意Android中与用户交互的对话框,Toast等必须放在UI主线程中,对于子线程,需要和用户交互时。可通过广播或Handler等更新UI。

最后,附上完整代码下载地址:http://download.csdn.net/detail/u010538765/6303059。

        

原创粉丝点击