2011-05-01 67 views
1


在我的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

请从在你的标题标签不要 - 这就是标签是。 – Femaref 2011-05-01 10:19:44

回答

1

“但这样一来,我有三个不同的地方,在这里这个简单的任务传遍代码”

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

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

0

现在实际上模态对话框的问题主要是程序流程的一个问题。你想把东西放在一起。您想要显示一个对话框,返回“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; 
    } 
} 

}