java - sirve - ¿Cómo puedo pasar valores entre un cuadro de diálogo y una actividad?
personalizar joptionpane (2)
Le pido al usuario que ingrese a través de un cuadro de diálogo:
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();
}
}
}
Cuando el usuario pulsa Aceptar, ¿cómo puedo pasar el valor que se ingresó en el cuadro de texto a una variable miembro en la Actividad que lo lanzó?
Lo logro transmitiendo la intención de [diálogo] a [actividad] .
Primero pasando la actividad a la función:
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();
}
}
});
}
}
Llame a la función anterior cuando algún menú o botón de opción haga clic en su actividad.
Luego prepare su actividad para recibir la intención con BroadcastReceiver en la actividad:
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.
.....
}
}
};
No olvide registrar y anular el registro del receptor:
@Override
protected void onPause() {
unregisterReceiver(mReceiver);
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, new IntentFilter(IntentAction.INTENT_ADD_TASK));
}
Puede hacerlo de diferentes formas ... en realidad, si su cuadro de diálogo tiene solo un botón "Aceptar" para descartar, ¿por qué no simplemente crea un cuadro de diálogo personalizado utilizando la clase AlertDialog.Builder
lugar de crear una subclase de cuadro de Dialog
?
De todos modos ... supongamos que tienes buenas razones para hacerlo de la manera en que lo hiciste. En ese caso, usaría el ObserverPattern. Algo como esto:
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);
}
}
En tu actividad:
CustomDialog dialog;
// initialization stuff, blah blah
dialog.setDialogResult(new OnMyDialogResult(){
public void finish(String result){
// now you can use the ''result'' on your activity
}
});
Al leer su código, parece que ya ha intentado algo similar.
Editar: hacerlo de la manera más fácil
Aún puede usar su diseño mycustomdialog
. Y así es como usaría 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();