Je demande à l'utilisateur une entrée via une boîte de dialogue:
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();
}
}
}
Lorsque l'utilisateur clique sur OK, comment puis-je transmettre la valeur entrée dans la zone de texte, à une variable membre dans l'activité qui l'a lancée?
Vous pouvez le faire de différentes manières ... en fait, si votre boîte de dialogue n'a qu'un bouton "OK" à ignorer, pourquoi ne pas simplement créer une boîte de dialogue personnalisée en utilisant le AlertDialog.Builder
classe au lieu de sous-classer Dialog
?
Quoi qu'il en soit ... supposons que vous ayez de bonnes raisons de le faire comme vous l'avez fait. Dans ce cas, j'utiliserais l'ObserverPattern. Quelque chose comme ça:
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);
}
}
Sur votre activité:
CustomDialog dialog;
// initialization stuff, blah blah
dialog.setDialogResult(new OnMyDialogResult(){
public void finish(String result){
// now you can use the 'result' on your activity
}
});
En lisant votre code, il semble que vous ayez déjà essayé quelque chose de similaire.
Vous pouvez toujours utiliser votre disposition mycustomdialog
. Et voici comment vous utiliseriez le 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();
J'y parviens grâce à l'intention de diffusion de [dialogue] à [activité].
Passer d'abord l'activité dans la fonction:
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();
}
}
});
}
}
Appelez la fonction ci-dessus lorsqu'un menu d'options ou un bouton est cliqué dans votre activité.
Préparez ensuite votre activité pour recevoir l'intention avec BroadcastReceiver dans l'activité:
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.
.....
}
}
};
N'oubliez pas d'enregistrer et de désinscrire le récepteur:
@Override
protected void onPause() {
unregisterReceiver(mReceiver);
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, new IntentFilter(IntentAction.INTENT_ADD_TASK));
}