代码重用
创建对话框是您的应用程序中非常普遍的需求,它可以在移动,桌面甚至是Web应用程序中向用户显示一个对话框以获取值。 此外,值的范围可以从简单的“确定-取消”对话框结果到“可检查”值列表甚至日期范围。 我经历了为每个对话框创建一个android对话框的需要,以便在最近的android应用程序项目中显示报告。 尽管Java api在创建对话框界面元素方面提供了最大的灵活性,但没有可以调用的现成方法,例如消息对话的结果,例如:result = MessageBox.Show();
其他语言(例如C#和VB)提供了这样的方法来显示模式对话框,这些对话框在等待模式对话框后返回值。 但不幸的是,android中没有“模态”的概念。 线程不能只是闲着等待输入,因为资源太宝贵了。 取而代之的是回调的概念,因此该方法无需您等待对话框返回,而可以调用传递给它的函数引用:
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("Milk supply tracker");
builder.setMessage(message);
builder.setPositiveButton("Yes",listener);
builder.setNegativeButton("No",listener);
builder.create().show();
此处的侦听器是单击“是”或“否”按钮时将调用的函数的参考。 这不仅使您的代码复杂化,而且很难重用代码来处理不同的情况,例如从一系列值中进行选择或获取日期/时间范围。 为了解决这个问题,我创建了一个单独的Java类Dialog,并添加了ShowDialog()方法的变体来处理每种类型的对话框:
class Dialog
{
public static void ShowMessageDialog(Context context, String message)
{
ShowDialog(context,message,MessageBoxType.OKOnly,new String[]{},false, null,null);
}
public static void ShowMessageDialog(Context context, String message, MessageBoxType type , OnClickListener listener)
{
ShowDialog(context,message,type,new String[]{},false, listener,null);
}
public static void ShowListDialog(Context context, String message, String[] listItems, boolean isMultiChoice, OnClickListener listener)
{
if (isMultiChoice)
ShowDialog(context, message, MessageBoxType.OkCancel , listItems, isMultiChoice, listener,null);
else
ShowDialog(context, message, MessageBoxType.OKOnly , listItems, isMultiChoice, null,listener);
}
public static void ShowDateDialog(Context context,String message,OnDateSetListener listener)
{
Calendar c=Calendar.getInstance();
int y=c.get(Calendar.YEAR);
int m=c.get(Calendar.MONTH);
int d=c.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dlg=new DatePickerDialog(context, listener, y, m, d);
dlg.setTitle(message);
dlg.show();
}
}
如您所见,ShowMessageDialog()接受不同的参数,取决于是否需要侦听器。 另一方面,ShowListDialog()传递一个字符串数组以创建一个对话框,该对话框显示一个可供用户选择的值列表。 isMultiChoice参数针对选择列表中的每个值指示是否需要一个复选框。 所有这些实际上都是在ShowDialog()私有方法中实现的,而ShowDateDialog()有其自己的实现。 这是ShowDialog()的来源:
private static void ShowDialog(Context context, String message, MessageBoxType type , String[] listItems, boolean isMultiChoice, OnClickListener listener,OnClickListener selectedItemListener)
{
AlertDialog.Builder builder=new AlertDialog.Builder(context);
if (listItems.length>0 && isMultiChoice==false)
{
CheckedItems=new ArrayList();//won't be used in this case.
builder.setTitle(message);
builder.setItems(listItems, selectedItemListener);
}
else if (listItems.length>0 && isMultiChoice==true)
{
CheckedItems=new ArrayList();
builder.setTitle(message);
builder.setMultiChoiceItems(listItems, null, new OnMultiChoiceClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which, boolean checked)
{
if (checked)
CheckedItems.add(which);
else
{
if (CheckedItems.contains(which))
CheckedItems.remove(which);
}
}
});
}
else
{
builder.setTitle("Milk supply tracker");
builder.setMessage(message);
}
if (listItems.length==0 || isMultiChoice)
{
switch(type)
{
case OKOnly:
builder.setPositiveButton("OK",listener);
break;
case OkCancel:
builder.setPositiveButton("OK",listener);
builder.setNegativeButton("Cancel",listener);
break;
case YesNo:
builder.setPositiveButton("Yes",listener);
builder.setNegativeButton("No",listener);
break;
}
}
builder.create().show();
}
因此,希望此类可以满足您与在Android应用上显示对话框相关的所有需求。 这是一个如何使用复选框上的ShowListDialog()实际调用的工作示例:
selItems=new String[]{"apples","oranges","grapes"};
Device.ShowListDialog(this,"Select a fruit" ,this.selItems, true, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
if (which==DialogInterface.BUTTON_POSITIVE)
{
for(int i:Device.CheckedItems)
Dialog.ShowMessageDialog(ReportsActivity.this, "selected:" + selItems[i]);
}
}
});
}
翻译自: https://www.javacodegeeks.com/2014/06/how-to-create-android-dialogs-in-a-reusable-manner.html
代码重用