【问题标题】: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 的结果吗?
  • 那里有一个错字,对不起,任何人都可以。我只想在屏幕上显示一些东西,然后从那里继续代码。在正常的工作流程中,您在那里看到的所有代码都会在屏幕上显示对话框之前完成。

标签: android android-activity dialog


【解决方案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);;
【解决方案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

        这是我的代码。

        1. 当您开始活动时。 例如)你从 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);
          
        2. 在 TestActivity 中。

          public void onClickCancel() {
              setResult(Activity.RESULT_CANCELED);
              finish();
          }
          
          public void onClickConfirm() {
              setResult(Activity.RESULT_OK);
              finish();
          }
          
        3. 当您在 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”)可以继承其外部类的状态。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-18
              • 2019-07-31
              • 1970-01-01
              相关资源
              最近更新 更多