I am asking the user for input via a Dialog:
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();
}
}
}
When the user hits OK, how can I pass the value that was entered in the textbox, back to a member variable in the Activity that launched it?
You can do that in different ways... actually, if your dialog has only an "OK" button to dismiss, why don't you just create a custom dialog using the AlertDialog.Builder
class instead of subclassing Dialog
?
Anyway... let's suppose you have good reasons to do it the way you did it. In that case, I'd use the ObserverPattern. Something like this:
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);
}
}
On your activity:
CustomDialog dialog;
// initialization stuff, blah blah
dialog.setDialogResult(new OnMyDialogResult(){
public void finish(String result){
// now you can use the 'result' on your activity
}
});
Reading your code it seems you already tried something similar.
Edit: doing it the easy way
You can still use your mycustomdialog
layout. And this is how you would use the 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();
I achieve this through broadcasting intent from [dialog] to [activity].
First passing the activity into the function:
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();
}
}
});
}
}
Call above function when some option menu or button clicked in your activity.
Then prepare your activity to receive the intent with BroadcastReceiver in the activity:
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.
.....
}
}
};
Don't forget to register & un-register the receiver:
@Override
protected void onPause() {
unregisterReceiver(mReceiver);
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, new IntentFilter(IntentAction.INTENT_ADD_TASK));
}
You can get the value of any public variables of your dialog class in onDismiss listener like this
SaveRecordedFileDialogClass cdd = new SaveRecordedFileDialogClass(this,extraVariable);
cdd.setOnDismissListener(new
DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
myPublicActivityVar=cdd.anyTypevariable;
}
});
cdd.show();
精彩评论