我怎样才能传递一个对话框和一个活动之间的值?

我要求用户通过一个对话框input:

package com.android.cancertrials; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class CustomDialog extends Dialog { private String name; // private ReadyListener readyListener; public static EditText etName; public String zip; public CustomDialog(Context context, String name) { super(context); this.name = name; // this.readyListener = readyListener; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mycustomdialog); setTitle("Enter the Zip Code "); Button buttonOK = (Button) findViewById(R.id.ok); buttonOK.setOnClickListener(new OKListener()); etName = (EditText) findViewById(R.id.EditZip); } private class OKListener implements android.view.View.OnClickListener { @Override public void onClick(View v) { // readyListener.ready(String.valueOf(etName.getText())); CustomDialog.this.dismiss(); } } } 

当用户点击确定时,我怎样才能将在文本框中input的值传回到启动它的Activity中的成员variables?

Solutions Collecting From Web of "我怎样才能传递一个对话框和一个活动之间的值?"

你可以用不同的方法做到这一点…实际上,如果你的对话框只有一个“确定”button来消除,为什么不使用AlertDialog.Builder类来创build一个自定义的对话框而不是子类化Dialog

无论如何,让我们假设你有这样做的好理由。 在这种情况下,我会使用ObserverPattern。 像这样的东西:

 public class CustomDialog extends Dialog { private String name; public static EditText etName; public String zip; OnMyDialogResult mDialogResult; // the callback public CustomDialog(Context context, String name) { super(context); this.name = name; } @Override public void onCreate(Bundle savedInstanceState) { // same you have } private class OKListener implements android.view.View.OnClickListener { @Override public void onClick(View v) { if( mDialogResult != null ){ mDialogResult.finish(String.valueOf(etName.getText())); } CustomDialog.this.dismiss(); } } public void setDialogResult(OnMyDialogResult dialogResult){ mDialogResult = dialogResult; } public interface OnMyDialogResult{ void finish(String result); } } 

在你的活动上:

 CustomDialog dialog; // initialization stuff, blah blah dialog.setDialogResult(new OnMyDialogResult(){ public void finish(String result){ // now you can use the 'result' on your activity } }); 

读你的代码似乎你已经尝试了类似的东西。

编辑:做这个简单的方法

你仍然可以使用你的mycustomdialog布局。 这就是你如何使用AlertDialog.Builder

 LayoutInflater inflater = LayoutInflater.from(YourActivity.this); final View yourCustomView = inflater.inflate(R.layout.mycustomdialog, null); final TextView etName = (EditText) yourCustomView.findViewById(R.id.EditZip); AlertDialog dialog = new AlertDialog.Builder(YourActivity.this) .setTitle("Enter the Zip Code") .setView(yourCustomView) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { mSomeVariableYouHaveOnYourActivity = etName.getText().toString(); } }) .setNegativeButton("Cancel", null).create(); dialog.show(); 

我通过从[对话][活动]广播意图来实现这一点。

首先将活动传递给函数:

 public class DialogFactory { public static AlertDialog addSomeDialog(Activity activity) { builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (SOMETHING_IS_TRUE) { // prepare your parameters that need to be sent back to activity Intent intent = new Intent(IntentAction.INTENT_ADD_TASK); intent.putExtra(IntentConst.PARAM_A, aInput); intent.putExtra(IntentConst.PARAM_B, bInput); activity.sendBroadcast(intent); Toast.makeText(activity, "Something is TRUE!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(activity, "Something NOT TRUE!", Toast.LENGTH_SHORT).show(); } } }); } } 

当您的活动中点击某个选项菜单或button时,请调用上述function。

然后准备好您的活动,以便在活动中使用BroadcastReceiver接收意图:

 private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == IntentAction.INTENT_ADD_TASK) { // Do whatever you want to refresh the layout or anything in the activity // or even ask fragments inside to act upon it. ..... } } }; 

不要忘记注册和注销接收器:

 @Override protected void onPause() { unregisterReceiver(mReceiver); super.onPause(); } @Override protected void onResume() { super.onResume(); registerReceiver(mReceiver, new IntentFilter(IntentAction.INTENT_ADD_TASK)); }