现在实际上模态对话框的问题主要是程序流程的一个问题。你想把东西放在一起。您想要显示一个对话框,返回“ok”或“cancel”并添加,例如用户输入到其中一个对话框小部件的字符串。
我不想写出一半的代码,直到我需要在一个地方的对话框的结果和另一个地方的代码的其余部分,即对话框的onClickListener的结果。
在某些情况下,第一个对话框可能会调用第二个对话框,例如指定不在第一个对话框的ListView列表中的颜色。
你的代码会遍布整个地方(在每个对话框的onClickListener按钮中),并且很难阅读或维护。
现在写了一些不清晰的代码之后,我想出了以下解决方案,它肯定会尊重Android设计指南。
不是直接显示对话框,而是创建一个处理消息的Handler派生类。
我发送了第一条消息,它创建并显示一个对话框。它还将处理程序转发到对话框,并且它的onStop方法中的diaolg将另一个消息发送到处理程序,指示对话框的结束。在那里,您可以检查对话框属性,编辑字段的内容或者是否使用OK或CANCEL停止。 现在在消息处理程序中,任务的所有逻辑都位于消息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;
}
}
}
请从在你的标题标签不要 - 这就是标签是。 – Femaref 2011-05-01 10:19:44