Android 从带有结果的对话框或活动返回

Android 从带有结果的对话框或活动返回,android,android-activity,dialog,Android,Android Activity,Dialog,我想知道我是否可以冻结当前活动,同时等待其他活动或对话框(任何可以)完成 我知道我可以为结果启动一个活动,并在那里处理这些结果,但是startActivityForResult()之后的代码仍然会被执行 这是我想做的事情: PopupDialog dialog = new PopupDialog(this,android.R.style.Theme_Black_NoTitleBar); dialog.show(); // wait here, and continue the code afte

我想知道我是否可以冻结当前活动,同时等待其他活动或对话框(任何可以)完成

我知道我可以为结果启动一个活动,并在那里处理这些结果,但是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
}

我知道这听起来一定很奇怪,但如果有人能告诉我如何实现这种功能,我将不胜感激。

我也不完全理解。若您想捕获活动的结果,那个么只需启动“startActivityForResult”函数即可。如果您想在dialog中捕获一些结果,那么您可以简单地将所有函数(在按下dialog上的按钮后应继续)放入dialog上每个按钮的onClickListener中

尝试为对话框提供一个按钮,通过对活动中的某些内容的方法调用实现一个
onClickListener
。所述方法中的代码仅在单击按钮时运行,因此您希望根据按钮的操作,使用不同的参数调用该方法。

您也可以使用
onActivityResult
在您的主要活动电话中
startActivityForResult(意图,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
}
}

在对话框中,如果希望得到结果,则应使用回调方法,这些方法可以在单击对话框按钮时执行

例如:

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
方法将不会执行,但当您点击对话框中的任何按钮时,它将执行。

我在对话框中使用回调返回用户选择的某些字符串或值


i、 e.在你的对话中实现一个界面

我回答这个问题晚了几年,但这是我的答案

我有一个表示表单/文件的类。它有一个公共成员“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;
}

您将看到结果变量“mdeled”必须是封闭类的成员;这是由于Java奇怪但奇妙的变幻莫测。其中内部类(在本例中为:“DialogInterface.OnClickListener dialogClickListener”)可以继承其外部类的状态。

您可以使用
onActivityResult

这是我的密码

  • 当你开始活动时。 ex)您可以这样从MainActivity调用TestActivity

    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);
    
    @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...
        }
    }
    
  • 在测试活动中

    public void onClickCancel() {
        setResult(Activity.RESULT_CANCELED);
        finish();
    }
    
    public void onClickConfirm() {
        setResult(Activity.RESULT_OK);
        finish();
    }
    
  • 当您在MainActivity上获得结果代码时,您可以这样做

    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);
    
    @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...
        }
    }
    

  • 对于那些以实现对话框来获得结果的方式被询问的人,但是没有使用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);
    }
    

    我找不到你。你想得到对话或活动的结果吗?那里有一个打字错误,对不起,任何人都可以。我只是想在屏幕上显示一些东西,然后从那里继续代码。在正常的工作流程中,您看到的所有代码都会在对话框显示在屏幕上之前完成。最简单的方式是,我希望得到如下内容
    int resultCode=showCustomDialog()
    。我知道我可以从对话框中得到结果,但我不知道是否可以这样返回结果,因为这样会使很多代码看起来更好。嗯,我可能理解。您希望实现与经典J2SE相同的行为,对吗?我担心这在android中是不可能的。我真的建议使用编写Labeeb P的方式,或者使用一些自定义对话框来扩展android.app.dialog和一些处理所有返回的界面possibility@zidarsk8我现在也面临着同样的问题,你找到解决办法了吗谢谢,这是正常的使用方法。但这会破坏代码。我的问题是,我能调用一个活动,在相同的函数中得到结果,然后继续工作吗。请参阅我对上一个答案的评论。在对话框中,哪里可以看到
    setResult
    方法?您可以将
    getContext()
    转换为
    Activity
    ((Activity)getContext())。setResult(2,intent)相关职位: