2011-05-10 19 views
17

Estoy usando AlertDialog.Builder para mostrar un cuadro de diálogo para solicitar al usuario que ingrese una contraseña, luego deseo guardar esa contraseña en una preferencia, sin embargo, no puedo encontrar la manera de obtener el resultado de la entrada del diálogo de alerta método.¿Cómo puedo obtener los resultados de un AlertDialog?

Aquí es esencialmente lo que me gustaría ser capaz de hacer:

String result; 
    AlertDialog.Builder b = new AlertDialog.Builder(this); 
    b.setTitle("Please enter a password"); 
    final EditText input = new EditText(this); 
    b.setView(input); 
    b.setPositiveButton("OK", new DialogInterface.OnClickListener() 
    { 
     @Override 
     public void onClick(DialogInterface dialog, int whichButton) 
     { 
      //I get a compile error here, it wants result to be final. 
      result = input.getText().toString(); 
     } 
    }); 
    b.setNegativeButton("CANCEL", null); 
    b.create().show(); 

Sin embargo, estoy abierto a hacer algo como showDialog(int); a continuación, utilizando el método onCreateDialog(int) y de alguna manera establecer el resultado y la recepción de alguna otro método, pero no tengo idea de cómo llevar a cabo la última parte.

Respuesta

22
public class MyActivity extends Activity { 
    private String result; 

    void showDialog() { 
     AlertDialog.Builder b = new AlertDialog.Builder(this); 
     b.setTitle("Please enter a password"); 
     final EditText input = new EditText(this); 
     b.setView(input); 
     b.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int whichButton) { 
       result = input.getText().toString(); 
      } 
     }); 
     b.setNegativeButton("CANCEL", null); 
     b.show(); 
    } 
} 
3

ejemplo simplificado:

public interface TextListener { 
    void onPositiveResult(CharSequence text); 
} 

public static AlertDialog getTextDialog(Context ctx, 
     final TextListener listener) { 
    View view = LayoutInflater.from(ctx).inflate(R.layout.dialog, null); 
    final TextView tv = (TextView) view.findViewById(R.id.tv); 
    AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
    builder.setView(view); 
    // 
    builder.setPositiveButton(android.R.string.ok, new OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      listener.onPositiveResult(tv.getText()); 
     } 
    }); 
    builder.setNegativeButton(android.R.string.cancel, null); 
    return builder.create(); 
} 

- EDITAR - O tratan este código:

public class Main extends Activity { 
    private Button btn; 
    private String result; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       showDialog(0); 
      } 
     }); 
    } 

    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case 0: 
      final EditText input = new EditText(this); 

      return new AlertDialog.Builder(this) 
      .setIcon(R.drawable.icon) 
      .setTitle("Please enter a password") 
      .setView(input) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int whichButton) { 
        Toast.makeText(getBaseContext(), input.getText().toString(), Toast.LENGTH_SHORT).show(); 
       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int whichButton) { 
        Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show(); 
       } 
      }).create(); 
     } 

     return null; 
    } 
} 
+0

Lo siento, no entiendo muy bien lo que está pasando aquí, o cómo iba a usar esto para lograr lo que estoy tratando de lograr. – finiteloop

+0

@segfault, editado mi respuesta – evilone

+2

evilone sugiere utilizar el patrón Observer y crear su propio oyente (TextListener).Su actividad que aloja este AlertDialog puede implementar TextListener que llamará aPostitiveResult (CharSequence) fuera de AlertDialog, y pasará el resultado que está buscando en función de su pregunta. A continuación, puede actuar en su resultado como lo desee. –

1

resultado variable, lo convierten en una variable miembro, en lugar de variable local. Al hacer "resultado" como variable miembro es accesible en toda la actividad (clase padre que se extiende actividad)

+0

+1 para la respuesta correcta. Elegí a @ Femi porque era más robusto. ¡Gracias! – finiteloop

1

solución débil pero rápido:.

Declarar un método de Nivel de Actividad:

TextView lblDiaDestination; 

public void dialogReturn(String msg){ 
    lblDiaDestination.setText(msg); 
} 

y llamarlo de positivo clic de botón listner:

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) { 
     dialogReturn( input.getText().toString().trim() ); 
    }); 

Usted puede cambiar el valor lblDiaDestination justo antes alert.show():

lblDiaDestination = myTextView; 
alert.show(): 
0

Esta bastante largo. Espero que mi contribución sea útil para los recién llegados. Creo que la clave para responder a la pregunta es declarar la variable resultado como miembro de la actividad (llamémoslo YourActivity). Luego, desde el interior del método "onClick", use YourActivity.this.result para acceder a esta variable.

edito @finiteloop códigos de la siguiente manera:

public class YourActivity extends Activity { 
    private String result; 
    // other activity stuff 

    void showDialog(){ 
     AlertDialog.Builder b = new AlertDialog.Builder(this); 
     b.setTitle("Please enter a password"); 
     final EditText input = new EditText(this); 
     b.setView(input); 
     b.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int whichButton) {   
       YourActivity.this.result = input.getText().toString(); 
      } 
     }); 
     b.setNegativeButton("CANCEL", null); 
     b.create().show(); 
    } 
} 
Cuestiones relacionadas