从对话框或活动返回结果

21

我想知道是否可以冻结当前的Activity,同时等待另一个Activity或对话框(任何一个都可以)完成。

我知道我可以启动一个带返回结果的Activity,并在那里处理它们,但是在startActivityForResult()之后的代码仍将被执行。

这是我想做的事情:

PopupDialog dialog = new PopupDialog(this,android.R.style.Theme_Black_NoTitleBar);
dialog.show();
// wait here, and continue the code after the dialog has finishes
int result = getResultFromDialogSomehow();
if (result == 1){
    //do something
}else{
    //do something else
}

我知道这听起来相当奇怪,但是如果有人能告诉我如何实现这样的功能,我会非常感激。


2
我不明白你的意思。你想获取对话框(Dialog)还是活动(Activity)的结果? - Dharmendra
那里有一个拼写错误,抱歉,任何一个都可以。我只想找一种方法在屏幕上显示一些内容,然后从那里继续执行代码。在正常的工作流程中,您看到的所有代码都会在对话框显示在屏幕上之前完成。 - zidarsk8
8个回答

14

你也可以使用 onActivityResult 方法
在你的主活动中调用
startActivityForResult(intent, 1); // 这里的 1 是请求码

在你的对话框类中:

Intent intent = new Intent();
intent.putExtra(....) //add data if you need to pass something
setResult(2,intent); //Here 2 result code

那么你的主要活动

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (resultCode == 2 && requestCode ==1){
    //do something
}else{
    //do something else
}
}

1
谢谢,这是使用它的正常方式。但这会打断代码。我的问题是,我能否在同一个函数中调用一个活动,并获取结果,然后继续工作。请查看我对先前答案的评论。 - zidarsk8
3
你在对话框中看到了setResult方法吗? - Swato
1
你可以将 getContext() 转换为 Activity((Activity) getContext()).setResult(2,intent); - Labeeb Panampullan
相关帖子:https://dev59.com/82gv5IYBdhLWcg3wBMOg - Roger Huang

10

在对话框中,如果你期望有一个结果,那么应该使用回调方法。这些方法会在你点击对话框按钮时执行。

例如:

AlertDialog.Builder builder = new AlertDialog.Builder(getDialogContext());
builder.setMessage("Message");
builder.setPositiveButton("Yes", new Dialog.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) { 
        Toast.makeText(this, "Yes", Toast.LENGTH_SHORT).show();
        dialog.cancel();
    }

});

builder.setNegativeButton("No", new Dialog.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(this, "No", Toast.LENGTH_SHORT).show();
        dialog.cancel();

    }

});

builder.show();

这样,onClick方法不会在代码运行时执行,但是当你点击对话框内的任何一个按钮时,它将执行。


3
我在对话框中使用回调来返回用户选择的字符串或值。
例如,在您的对话框中实现一个接口。

1
尝试给对话框添加一个按钮,实现一个onClickListener并调用活动中的某个方法。该方法中的代码仅在单击按钮时运行,因此您需要为不同的按钮使用不同的参数调用该方法,具体取决于它们所执行的操作。

1

对于那些想要实现一个对话框以获取结果,但不想使用onActivityResult的人,这里提供了一个使用回调函数的示例。这样,您可以从任何地方调用此自定义对话框,并根据选择执行某些操作。

简短方式

public void getDialog(Context context, String title, String body, 

    DialogInterface.OnClickListener listener){

        AlertDialog.Builder ab = new AlertDialog.Builder(context);
        ab
                .setTitle(title)
                .setMessage(body)
                .setPositiveButton("Yes", listener)
                .setNegativeButton("Cancel", listener)
        ;//.show();

        Dialog d=ab.create();
        d.setCanceledOnTouchOutside(false);

        d.show();
    }

    private void showDialog(){
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                switch (which){
                    case DialogInterface.BUTTON_POSITIVE:
                        //DO
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        //DO
                        break;
                }
            }
        };

        getDialog(
                this,
                "Delete",
                "Are you sure to delete the file?",
                dialogClickListener
        );

    }

另一种方式,适用于您需要实现不同变体的对话框,因为您可以在一个地方定义所有操作。

MyDialog.java

public class MyDialog{

    public void deleteDialog(Context context){
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                switch (which){
                    case DialogInterface.BUTTON_POSITIVE:
                        if(listener!=null)
                            listener.onDeleteDialogResponse(true);
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        if(listener!=null)
                            listener.onDeleteDialogResponse(false);
                        break;
                }
            }
        };

        AlertDialog.Builder ab = new AlertDialog.Builder(context);
        ab.setMessage("Are you sure to delete?")
                .setPositiveButton("Yes", dialogClickListener)
                .setNegativeButton("Cancel", dialogClickListener)
                .show();


    }

/** my listner */
    public interface MyDialogListener{
        public void onDeleteDialogResponse(boolean respononse);
    }
    private MyDialogListener listener;

    public void setListener(MyDialogListener listener) {
        this.listener = listener;
    }

}

像这样使用

private void showDialog(){        
        MyDialog dialog=new MyDialog();
        dialog.setListener(new MyDialog.MyDialogListener() {
            @Override
            public void onDeleteDialogResponse(boolean respononse) {
                if(respononse){
                    //toastMe("yessss");
                    //DO SOMETHING IF YES
                }else{
                    //toastMe("noooh");
                    //DO SOMETHING IF NO
                }
            }
        });

            dialog.deleteDialog(this);
}

1
你可以使用 onActivityResult
这是我的代码。
  1. when you start activity. ex) you call TestActivity from MainActivity you can do like this.

    Constants.REQUEST_CODE = 1000; // this is a global variable...and it must be a unique.
    ....
    Intent intent = new Intent(this, TestActivity.class);
    startActivityForResult(intent, Constants.REQUEST_CODE);
    
  2. in TestActivity.

    public void onClickCancel() {
        setResult(Activity.RESULT_CANCELED);
        finish();
    }
    
    public void onClickConfirm() {
        setResult(Activity.RESULT_OK);
        finish();
    }
    
  3. when you get result code on MainActivity, you can do like this.

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == Constants.REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            // todo something...
        } else if (requestCode == Constants.REQUEST_CODE && resultCode == Activity.RESULT_CANCELED) {
            // todo something...
        }
    }
    

0

我也不是完全理解。如果你想从活动中获取结果,那么你可以简单地使用你提到的“startActivityForResult”函数开始。如果你想在对话框中捕获一些结果,那么你可以简单地将所有函数(在你按下对话框上的按钮后应该继续执行的函数)放到每个按钮的onClickListener中。


最简单的表述方式是,我想要得到类似于这样的东西 int resultCode = showCustomDialog()。我知道可以从对话框中获取结果,但我不确定是否可以像这样返回它们,因为这将使得很多代码看起来更加优美。 - zidarsk8
嗯,我大概明白了。你想要与经典的J2SE相同的行为,对吧?我担心在Android中这是不可能的。我真的建议使用Labeeb P编写的方法或者使用一些自定义对话框来扩展android.app.Dialog,并使用一些接口来处理所有返回可能性。 - Menion Asamm
1
@zidarsk8,我也遇到了同样的问题,你找到解决方法了吗? - Mr.Cool

0

我回答这个问题已经晚了几年,但是无论如何,这是我的答案。

我有一个代表表单/文件的类。它有一个公共成员"deleteDialog()",允许按需删除文件,并向调用者返回"true"或"false"值。

这是它的样子:

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;

public class Form {

private Context mContext;
private CharSequence mFilePath;
private boolean mDeleted = false; // Set to "true" if this file is deleted. 
    /*...etc etc...*/

public boolean deleteDialog() {
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
        //@Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which){
            case DialogInterface.BUTTON_POSITIVE:
                //Do your Yes progress
                mDeleted = mContext.deleteFile(mFilePath.toString());
                break;

            case DialogInterface.BUTTON_NEGATIVE:
                //Do your No progress
                mDeleted = false;
                break;
            }
        }
    };
    AlertDialog.Builder ab = new AlertDialog.Builder(mContext);
    ab.setMessage("Are you sure to delete?")
        .setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("Cancel", dialogClickListener)
        .show();
    return mDeleted;
}

你会发现结果变量 - “mDeleted” - 必须是封闭类的成员;这是由于 Java 的奇妙但古怪的变化。在这种情况下,内部类(即 "DialogInterface.OnClickListener dialogClickListener")可以继承其外部类的状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接