我要求用户通过对话框输入:
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();
}
}
}
当用户点击OK时,如何将在文本框中输入的值传递回启动它的Activity中的成员变量?
答案 0 :(得分:71)
你可以用不同的方式做到这一点......实际上,如果你的对话框只有一个“OK”按钮可以解除,你为什么不用AlertDialog.Builder
类创建一个自定义对话框而不是子类{ {1}}?
无论如何......让我们假设你有充分的理由按照你的方式去做。在那种情况下,我会使用ObserverPattern。像这样:
Dialog
关于您的活动:
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
答案 1 :(得分:1)
我通过广播意图从 [对话] 到 [活动] 实现这一目标。
首先将活动传递给函数:
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();
}
}
});
}
}
在您的活动中点击某个选项菜单或按钮时,请调用上述功能。
然后准备您的活动以在活动中接收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));
}