2013-07-27 12 views
5

W większości przypadków potrzebuję, aby użytkownik dokonał wyboru wiele razy. (Robię coś i podnosimy okno komunikatu, aby użytkownik mógł dokonać wyboru i kontynuować wykonywanie innych czynności (może nazywać się blokowaniem)) Więc napisałem wspólną funkcjęSposób korzystania z wartości zwracanej przez AlertDialog

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

Chociaż właściwie response działania użytkownika, ale zawsze do czasu (co oznacza, że ​​podczas gdy klikam przycisk, wartość poprzednią czynność jest widoczny przez wartość zmiennej globalnej w) Czy istnieje istnieje jakakolwiek funkcja, dzięki której mogłem uzyskać wartość zwracaną przez skrzynkę komunikacyjną i użyć jej w następujący sposób:

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

kontynuacją jest mój kod:

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(); 
    } 



} 

Odpowiedz

7

Nie sądzę, że istnieje jakiś sposób, aby uzyskać wartość z alertDialog jak ten

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

ponieważ do czasu swoją dialogowym zostanie pokazane, że onClick() twojego przycisku będzie już zakończony.

Proponuje się zastosowanie innego sposobu wdrożenia tego.

Ponieważ sposób, aby utworzyć alertDialog jest wewnątrz swojej działalności jest to tak proste jak tworzenie funkcję w swojej działalności jak poniżej:

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(); 

} 

i nazwać metoda w onClick()

tak :

+0

w innej funkcji, zamierzam użyć powrotu z funkcji wartość. jeśli używam zmiennej globalnej, to nie wiem, które wartości dla – George

+0

które wywołanie funkcji spowodowało wartość zmiennej odpowiedzi, nie wiem – George

+0

nie mogę zrozumieć, co masz na myśli przepraszam, czy możesz napisać to lepiej? : S, ale uważam, że jedynym ważnym rozwiązaniem, które pozwala uzyskać wartość zwrotną, jest wywołanie innej funkcji, która zaktualizuje twój interfejs użytkownika zgodnie z twoimi potrzebami, ponieważ gdy pokazujesz AlertDialog, nie ma możliwości potwierdzenia, kiedy okno dialogowe zostanie zamknięte od użytkownika i nie można po prostu wstrzymać wątku interfejsu użytkownika i czekać, aż zwrócona zostanie wartość z alertDialog. Więc musisz użyć czegoś takiego jak mój przykład. – ManosProm

0

Musisz pokazać toast za pozytywny i negatywny przycisk Kliknij wydarzenie. ponieważ po kliknięciu przycisku wyświetlany jest alert, a po nim, jeśli warunek zostanie wykonany, aby uzyskać wartość od ostatniego otwartego kliknięcia przycisku alertu. więc jest źle. spróbuj tego:

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 wiadomość jest próbką, realia używają innego kodu zamiast tego, tzn. Po prostu użyj wartości zwracanej AlertDialog. – George

+0

Nie można uzyskać wartości zwracanej dla kliknięcia przycisku alertu bez klikania w niego. więc musisz zrobić coś na kliknięciach przycisku alertu. wywołać dowolną funkcję na kliknięciach przycisków z wartościami przycisku alertu. –

0

Chociaż nie można bezpośrednio zwrócić wartość z AlertDialog, można wysłać odpowiedź do obsługi działalności jest:

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; 
} 
Powiązane problemy