使用模态对话框编程样式

时间:2011-05-01 10:14:04

标签: android coding-style


在我的Android应用程序中,在活动中的某个事件中,我想要询问用户名称(字符串)。我知道如何做到这一点:调用showDialog,在Activity.onCreateDialog方法中创建对话框(我需要为标签提供一个字符串)并在对话框的onClick中处理结果。这很好,令我满意 但是这样我有三个不同的地方,这个简单的任务遍布我的活动代码。我更希望将这些代码放在一起,编写一些这样的代码:

string result;
if (showSimpleEditDialog(idForLabelString, result)==DIALOG_OK)
{
    // do something with the result
}

或者可能是类实例

SimpleEditDialog dlg = new SimpleEditDialog(idForLabelString);
if (dlg.showModal()==DIALOG_OK)
{
    string result = dgl.getResult();
    // do something with the result
}

(“idForLabelString”将是标签要使用的某个资源ID,当用户单击“确定”时,DIALOG_OK将返回一些常量) 我知道,我必须写这个方法或这个类。但为了更好地阅读我的代码,我会这样做。有什么建议吗? 谢谢,
格哈德

2 个答案:

答案 0 :(得分:1)

“但这样我有三个不同的地方,这个简单的任务在整个代码中传播”

那你为什么不为这个任务创建一个方法呢?你在说什么听起来像某种'ActionListener'给我。这可以在Java / Swing中完成,但不能在Android中完成。

但是,如果你有三个对话框,当“是”时都需要这样做,例如按下“NO”,您可以将'DialogInterface.OnClickListener()'定义为全局内部类(或扩展'onClickListener'的第二个类),然后将其用于所有对话框。

答案 1 :(得分:0)

现在实际上模态对话框的问题主要是程序流的问题。你想把所有东西放在一起。您想要显示一个返回“ok”或“cancel”的对话框,例如用户在其中一个对话框小部件中输入的字符串。

我不想把代码的一半写到我需要一个地方对话结果的行,而另一个代码的其余代码就是对话框的onClickListener。

在某些情况下,第一个对话框可能会调用第二个对话框,例如指定不在第一个对话框的ListView列表中的颜色。

您的代码将遍布各处(在每个对话框的按钮onClickListener中),并且难以阅读或维护。

现在编写了一些不清楚的代码后,我提出了以下解决方案,肯定尊重Android设计指南。

我没有直接显示对话框,而是创建了一个处理消息的Handler派生类。

我发送第一条消息,创建并显示一个对话框。它还将处理程序转发到对话框,其中的diaolg的onStop方法向处理程序发送另一条消息,指示对话框的结束。在那里,您可以检查对话框属性,编辑字段的内容或是否使用“确定”或“取消”停止。 现在在消息处理程序中,任务的所有逻辑都处于消息arg1值的不同情况。

可能会跳过某些情况(例如,用户选择了标准颜色,并且不需要特殊颜色对话框)。

对话框独立于调用它们的场景,并且它们的代码仅反映其简单任务(从列表中选择,某些复选框等)。它们可以从其他场景中重复使用。

遵循一种模板如何使用这种方法:

public class DoSomethingWithDialogs extends Handler
{
Context context; // from which it was called
final static int stepBegin = 0;
final static int stepNext = 1;
final static int stepSomethingElse = 2;
final static int stepLast = 3;

protected DoSomethingWithDialogs(Context context)
{   
    this.context = context;
}

public static void start(Context context)
{   // this is the main (only) entry point from outside
    DoSomethingWithDialogs st = new DoSomethingWithDialogs(context);
    st.sendMessage(st.obtainMessage(0, stepBegin, 0));
}

@Override
public void handleMessage(Message msg)
{
    // step by step handling the task
    switch (msg.arg1)
    {
    case stepBegin:
    {
        SomeDlg somedlg = new SomeDlg(context, this, stepNext);
       // when the dialog closes, it sends a message to this with stepNext as arg1
        somedlg.show();
    }
        break;
    case stepNext:
    {   // this message was send by the dialog when it finished
        SomeDlg somedlg = (SomeDlg) msg.obj;
        if (msg.arg2 == Dialog.BUTTON_NEGATIVE)
        {
            // has been canceled, nothing to do
        } else
        {
            if (somedlg.someProperty)
            {

            } else
            {
                sendMessage(obtainMessage(0, stepSomethingElse, 0));
            }
        }
    }
        break;
    case stepSomethingElse:
        break;
    }
}

}