在我的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将返回一些常量)
我知道,我必须写这个方法或这个类。但为了更好地阅读我的代码,我会这样做。有什么建议吗?
谢谢,
格哈德
答案 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;
}
}
}