2013-07-27 7 views
5

Nella maggior parte dei casi, ho bisogno che l'utente faccia una scelta molte volte. (Faccio qualcosa e sollevo una finestra di messaggio affinché l'utente possa fare una scelta e continuare a fare altro (forse chiamato blocco)) così ho scritto una funzione comuneCome utilizzare il valore di ritorno di AlertDialog

public static void ShowMsgDialog(Context self,String title, String msg) 

Sebbene risposta corretta l'azione dell'utente, ma sempre in attesa (che significa mentre si fa clic sul pulsante, il valore della azione precedente è visibile il valore della variabile globale) c'è esiste una funzione che ho potuto ottenere il valore di ritorno della finestra di messaggio e usarlo in questo modo:

int ret = ShowMsgDialog(Context self,String title, String msg); 

Il seguire è il mio codice:

public class MainActivity extends Activity { 
    private Button button1; 
    enum Answer { YES, NO, ERROR}; 
    static Answer choice; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);  
     button1 = (Button)findViewById(R.id.button1); 

     button1.setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       ShowMsgDialog(MainActivity.this, "Information", "you choice? "); 
       if(choice == Answer.YES) 
        Toast.makeText(MainActivity.this, "YOU CHOICED YES", Toast.LENGTH_LONG).show(); 
       else if (choice == Answer.NO) 
        Toast.makeText(MainActivity.this, "YOU CHOICED NO", Toast.LENGTH_LONG).show(); 
       else 
        Toast.makeText(MainActivity.this, "ERROR OCUS", Toast.LENGTH_LONG).show(); 

       //int ret = ShowMsgDialog(MainActivity.this, "Information", "you choice? "); 
      } 
     });  
    } 

    public static void ShowMsgDialog(Context self,String title, String Msg){ 
     AlertDialog.Builder dlgAlert = new AlertDialog.Builder(self); 
     dlgAlert.setTitle(title); 
     dlgAlert.setMessage(Msg); 
     dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       // call your code here 
       choice = Answer.YES; 
      } 
     }); 
     dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       choice = Answer.NO; 
      } 
     }); 
     dlgAlert.show(); 
    } 



} 

risposta

7

Non credo che ci sia alcun modo per ottenere un valore da un alertDialog come questo

int ret = ShowMsgDialog(Context self,String title, String msg); 

perché per il momento la vostra finestra verrà mostrato il onClick() del tuo Button sarà già finito.

Quindi suggerisco di usare un altro modo per implementarlo.

Dato che il metodo per creare l'alertDialog è dentro la vostra attività è come facile come la creazione di una funzione nella vostra attività come di seguito:

public void userChose(String choise){ 

     if(choice == Answer.YES) 
      //YOUR CODE FOR YES HERE 
      Toast.makeText(MainActivity.this, "YOU CHOSE YES", Toast.LENGTH_LONG).show(); 
     else if (choice == Answer.NO) 
      //YOUR CODE FOR NO HERE 
      Toast.makeText(MainActivity.this, "YOU CHOSE NO", Toast.LENGTH_LONG).show(); 

} 

e chiamare il metodo onClick()

come questo :

 dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       userChose(Answer.YES); 
      } 
     }); 
     dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       userChose(Answer.NO); 
      } 
     }); 
+0

in funzione diversa, ho intenzione di usare il ritorno della funzione valore. se si utilizza la variabile globale, allora non so quali valori per – George

+0

quale chiamata funzione ha reso il valore della variabile risposta, non so – George

+0

non riesco a capire cosa vuoi dire scusa, puoi scriverlo meglio? : S, ma credo che l'unica soluzione valida per ottenere un valore di ritorno è chiamando un'altra funzione che aggiornerà l'interfaccia utente in base alle proprie esigenze, perché, quando si visualizza un AlertDialog, non è possibile stabilire quando verrà chiusa la finestra di dialogo dall'utente e non è possibile sospendere il thread dell'interfaccia utente e attendere finché non viene restituito un valore da alertDialog. Quindi è necessario utilizzare qualcosa come il mio esempio. – ManosProm

0

Hai bisogno di mostrare brindisi in positivo e negativo tasto evento Click. perché quando si fa clic sul pulsante viene visualizzato un avviso e successivamente se la condizione viene eseguita in modo da avere valore dall'ultimo clic del pulsante di avviso aperto. quindi è sbagliato. provare questo:

public static void ShowMsgDialog(Context self,String title, String Msg){ 
     AlertDialog.Builder dlgAlert = new AlertDialog.Builder(self); 
     dlgAlert.setTitle(title); 
     dlgAlert.setMessage(Msg); 
     dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       // call your code here 
       choice = Answer.YES; 
       Toast.makeText(MainActivity.this, "YOU CHOICED YES", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       choice = Answer.NO; 
       Toast.makeText(MainActivity.this, "YOU CHOICED NO", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     dlgAlert.show(); 
    } 
+0

Toast un messaggio è un esempio, realtà uso altro codice per sostituirlo, voglio solo usare il valore di ritorno di AlertDialog. – George

+0

non è possibile ottenere il valore di ritorno per il clic di alertbutton senza fare clic su di esso. quindi è necessario fare qualcosa sui clic dei pulsanti di avviso. chiama qualsiasi funzione sui clic del pulsante con i valori dei pulsanti di avviso. –

0

Mentre non è possibile tornare direttamente un valore da un AlertDialog, è possibile inviare la risposta al gestore di un'attività:

public static void ShowMsgDialog(Context self,String title, String Msg){ 
    AlertDialog.Builder dlgAlert = new AlertDialog.Builder(self); 
    dlgAlert.setTitle(title); 
    dlgAlert.setMessage(Msg); 
    dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      // call your code here 
      Message msg = Message.obtain(); 
      msg.arg1 = HandlerMessage.Yes.ordinal(); 
      mHandler.sendMessage(msg);     
     } 
    }); 
    dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // TODO Auto-generated method stub 
      Message msg = Message.obtain(); 
      msg.arg1 = HandlerMessage.No.ordinal(); 
      mHandler.sendMessage(msg); 
     } 
    }); 
    dlgAlert.show(); 
} 

enum HandlerMessage 
{ 
    Yes, 
    No 
} 

/** for posting authentication attempts back to UI thread */ 
private final IncomingHandler mHandler = new IncomingHandler(this); 

static class IncomingHandler extends Handler 
{ 
    private final WeakReference<MainActivity> mActivityWeakReference; 

    IncomingHandler(MainActivity activity) 
    { 
     mActivityWeakReference = new WeakReference<MainActivity>(activity); 
    } 

    @Override 
    public void handleMessage(Message msg) 
    { 
     MainActivity activity = mActivityWeakReference.get(); 
     if (activity != null) 
     { 
      activity.HandleMessage(msg); 
     } 
    } 
} 
public void HandleMessage(Message msg) 
{ 
    HandlerMessage handlerMessage = HandlerMessage.values()[msg.arg1]; 

    switch(handlerMessage){ 
     case Yes: 
       //Do something ... 
       break; 
      case No: 
       //Do something ... 
       break; 
} 
Problemi correlati