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

Posted

技术标签:

【中文标题】从带有结果的对话框或活动中返回【英文标题】:Returning from a dialog or activity with result 【发布时间】:2011-10-15 15:29:09 【问题描述】:

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

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

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

【问题讨论】:

我无法得到你。你想得到 Dialog 或 Activity 的结果吗? 那里有一个错字,对不起,任何人都可以。我只想在屏幕上显示一些东西,然后从那里继续代码。在正常的工作流程中,您在那里看到的所有代码都会在屏幕上显示对话框之前完成。 【参考方案1】:

您也可以使用onActivityResult 在您的主要活动电话中startActivityForResult(intent, 1); //here 1 is the request code

在你的 Dialog 类中

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


【讨论】:

谢谢,这是正常的使用方式。但是这种方式会破坏代码。我的问题是,我可以调用一个活动,并在同一个函数中得到结果,然后继续工作。请参阅我对上一个答案的评论。 您在对话框中哪里看到了setResult 方法? 您可以将getContext() 转换为Activity, ((Activity) getContext()).setResult(2,intent);; 相关帖子:***.com/questions/10905312/…【参考方案2】:

在一个对话框中,如果你期望一个结果,你应该使用回调方法,当你点击对话框的按钮时可以执行。

例如:

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】:

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

即在你的 Dialog 中实现一个接口

【讨论】:

【参考方案4】:

尝试给对话框一个按钮,实现一个onClickListener,并通过方法调用您的活动中的某些内容。所述方法中的代码将仅在单击按钮时运行,因此您需要使用不同的按钮参数调用该方法,具体取决于它们所做的事情。

【讨论】:

【参考方案5】:

您可以使用onActivityResult

这是我的代码。

    当您开始活动时。 例如)你从 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);
    

    在 TestActivity 中。

    public void onClickCancel() 
        setResult(Activity.RESULT_CANCELED);
        finish();
    
    
    public void onClickConfirm() 
        setResult(Activity.RESULT_OK);
        finish();
    
    

    当您在 MainActivity 上获得结果代码时,您可以这样做。

    @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...
        
    
    

【讨论】:

【参考方案6】:

对于那些对实现对话框以获取结果的方式感兴趣但没有使用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);

【讨论】:

【参考方案7】:

我也不是很明白。如果你想从活动中捕获结果,那么你可以简单地从你提到的“startActivityForResult”函数开始。如果您想在对话框中捕获一些结果,那么您可以简单地将所有功能(在您按下对话框上的按钮后应该继续)放入对话框上每个按钮的 onClickListener

【讨论】:

最简单的表达方式是我想得到类似int resultCode = showCustomDialog() 的东西。我知道我可以从对话框中获得结果,但如果可以像这样返回它们,我不会这样做,因为它会使很多代码看起来更好。 嗯,我大概明白了。您想要与经典 J2SE 相同的行为,对吗?我担心这在android中是不可能的。我真的建议编写 Labeeb P 或使用一些自定义对话框来扩展 android.app.Dialog 和一些接口来处理所有返回可能性 @zidarsk8 我也面临同样的问题,现在你找到解决方案了吗【参考方案8】:

我迟到了几年才回答这个问题,但这是我的答案。

我有一个代表表单/文件的类。它有一个公共成员“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”)可以继承其外部类的状态。

【讨论】:

以上是关于从带有结果的对话框或活动中返回的主要内容,如果未能解决你的问题,请参考以下文章

如何从对话框中的主活动更新 ImageButton 的图像资源

回到另一个活动中的活动中已打开的对话框

将字符串从对话框片段返回到活动 [重复]

安卓导航组件。显示带有从箭头到十字的变形导航图标的全屏对话框

返回上一个在 android 中有一个对话框的活动

如何在不关闭先前活动的情况下从通知中打开对话框样式的活动?