如何以可重用的方式创建android对话框

机器人人 创建对话框是应用程序中非常普遍的需求,它可以在移动,桌面甚至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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值