首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android“最佳实践”从对话框中返回值

Android“最佳实践”从对话框中返回值
EN

Stack Overflow用户
提问于 2010-12-18 03:07:45
回答 6查看 65.1K关注 0票数 59

从复杂的自定义对话框中将值返回给调用活动的“正确”方法是什么?例如,文本字段、日期或时间选择器、一堆单选按钮等,以及“保存”和“取消”按钮?

我在网上看到的一些技术包括:

对话框派生类中可由Activity

  • public "get“访问器读取的
  • 公共数据成员。。。“..”。。对话框类中的

处理程序从各种控件获取输入并将它们捆绑在一起传递回活动,因此当侦听器点击“保存”时,使用活动中的ReturnIntent()

  • Listeners将捆绑包传递回活动,该活动处理对话框中控件的输入,例如,TimePicker或DatePicker的侦听器实际上在活动中。在此方案中,实际上所有工作都是在活动中的一个侦听器中完成的,以获取“

”按钮,然后该活动直接询问对话框中的控件;该活动将关闭该对话框。

...plus更多,我已经忘记了。

有没有一种特定的技术被认为是规范正确的或“最佳实践”方法?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-18 04:29:28

我使用的方式如下:

  1. 我的所有活动都有一个相同的父活动(假设是ControlActivity)。对话框有适当的getter/setter
  2. When,我用自己的方法调用ControlActivity private volatile Bundle controlBundle;

public void showMyDialog(int id,Bundle bundle) { this.controlBundle=bundle;this.showDialog(id,bundle);}

所以每次我知道发送到对话框的参数时

  1. 当对话即将完成时,我正在对话框中形成另一个具有必需值的Bundle,然后将它们放入我的Activity包设置器:

代码语言:javascript
复制
((ControlActivity )this.getOwnerActivity).setControlBundle(bundle);

所以最后,当对话结束时,我知道对话框“返回”了值。我知道它不像int retCode=this.showMyDialog();,它有点复杂,但它是可行的。

票数 5
EN

Stack Overflow用户

发布于 2010-12-18 03:12:37

也许我误解了你的问题,但为什么不使用内置的侦听器系统:

代码语言:javascript
复制
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        // run whatever code you want to run here
        // if you need to pass data back, just call a function in your
        // activity and pass it some parameters
    }
})

这就是我处理对话框中数据的方式。

编辑:让我给你一个更具体的例子,它将更好地回答你的问题。我将从这个页面窃取一些示例代码,您应该阅读:

http://developer.android.com/guide/topics/ui/dialogs.html

代码语言:javascript
复制
// Alert Dialog code (mostly copied from the Android docs
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        myFunction(item);
    }
});
AlertDialog alert = builder.create();

..。

代码语言:javascript
复制
// Now elsewhere in your Activity class, you would have this function
private void myFunction(int result){
    // Now the data has been "returned" (as pointed out, that's not
    // the right terminology)
}
票数 23
EN

Stack Overflow用户

发布于 2011-12-02 05:22:23

对于我的MIDI应用程序,我需要yes/no/cancel确认对话框,所以我首先做了一个通用的StandardDialog类:

代码语言:javascript
复制
public class StandardDialog {

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.os.Handler;

    public class StandardDialog {
    public static final int dlgResultOk         = 0;
    public static final int dlgResultYes        = 1;
    public static final int dlgResultNo         = 2;
    public static final int dlgResultCancel     = 3;

    public static final int dlgTypeOk           = 10;
    public static final int dlgTypeYesNo        = 11;
    public static final int dlgTypeYesNoCancel  = 12;

    private Handler mResponseHandler;
    private AlertDialog.Builder mDialogBuilder;
    private int mDialogId;

    public StandardDialog(Activity parent, 
                          Handler reponseHandler, 
                          String title, 
                          String message, 
                          int dialogType, 
                          int dialogId) {

        mResponseHandler = reponseHandler;
        mDialogId = dialogId;
        mDialogBuilder = new AlertDialog.Builder(parent);
        mDialogBuilder.setCancelable(false);
        mDialogBuilder.setTitle(title);
        mDialogBuilder.setIcon(android.R.drawable.ic_dialog_alert);
        mDialogBuilder.setMessage(message);
        switch (dialogType) {
        case dlgTypeOk:
            mDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    mResponseHandler.sendEmptyMessage(mDialogId + dlgResultOk);
                }
            });         
            break;

        case dlgTypeYesNo:
        case dlgTypeYesNoCancel:
            mDialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    mResponseHandler.sendEmptyMessage(mDialogId + dlgResultYes);
                }
            });         
            mDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    mResponseHandler.sendEmptyMessage(mDialogId + dlgResultNo);
                }
            });         
            if (dialogType == dlgTypeYesNoCancel) {
                mDialogBuilder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        mResponseHandler.sendEmptyMessage(mDialogId + dlgResultCancel);
                    }
                });         
            }
            break;
        }
        mDialogBuilder.show();
    }
}

接下来,在我的主活动中,我已经有了一个用于处理来自其他线程的UI更新的消息处理程序,所以我只添加了用于处理来自对话框的消息的代码。通过在为各种程序函数实例化StandardDialog时使用不同的dialogId参数,我可以执行适当的代码来处理对不同问题的yes/no/cancel响应。这个想法可以通过发送数据包来扩展到复杂的自定义对话框,尽管这比简单的整型消息要慢得多。

代码语言:javascript
复制
private Handler uiMsgHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
        if (msg != null) {

            // {Code to check for other UI messages here}

            // Check for dialog box responses
            if (msg.what == (clearDlgId + StandardDialog.dlgResultYes)) {
                doClearDlgYesClicked();
            }
            else if (msg.what == (recordDlgId + StandardDialog.dlgResultYes)) {
                doRecordDlgYesClicked();
            }
            else if (msg.what == (recordDlgId + StandardDialog.dlgResultNo)) {
                doRecordDlgNoClicked();
            }
        }
    }
};

然后,我所需要做的就是在活动中定义do { all }()方法。为了打开一个对话框,作为一个例子,我有一个响应“清除记录的MIDI事件”按钮的方法,并按如下方式确认:

代码语言:javascript
复制
public void onClearBtnClicked(View view) {
    new StandardDialog(this, uiMsgHandler, 
        getResources().getString(R.string.dlgTitleClear),
        getResources().getString(R.string.dlgMsgClear), 
        StandardDialog.dlgTypeYesNo, clearDlgId);
}

在其他地方,clearDlgId被定义为唯一的整数。此方法会在activity前面弹出一个Yes/No对话框,该对话框会失去焦点,直到对话框关闭,此时activity会收到一条包含对话框结果的消息。如果单击了"Yes“按钮,则消息处理程序将调用doClearDlgYesClicked()方法。(我不需要" no“按钮的消息,因为在这种情况下不需要任何操作)。

无论如何,这个方法对我来说很有效,并且可以很容易地从对话框中传回结果。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4473940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档