从带有结果的对话框或活动中返回
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 的图像资源