2013-07-27 3 views
5

В большинстве случаев мне нужно, чтобы пользователь делал выбор много раз. (Я что-то делаю и поднимаю окно сообщения для пользователя, чтобы сделать выбор и продолжать делать что-то другое (может быть, он называется block)) Так что я написал общую функциюКак использовать возвращаемое значение AlertDialog

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

Хотя правильно Ответные действия пользователя, но всегда в ожидании (это означает, что в то время как я нажимаю кнопку, значение предыдущего действия является видимым значение глобальной переменной) есть существует любая функция, которая могла бы получить возвращаемое значение окна сообщения и использовать его так:

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

последующий мой код:

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



} 

ответ

7

Я не думаю, что есть какой-нибудь способ, чтобы получить значение из alertDialog как этот

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

, потому что к тому времени ваш диалог будет показано, что onClick() вашей кнопки уже закончена.

Поэтому я предлагаю использовать другой способ для реализации этого.

Поскольку метод для создания alertDialog внутри вашей деятельности так же легко, как и создание функции в вашей деятельности, как показано ниже:

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

} 

и вызвать ваш метод OnClick()

, как это :

 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

в другой функции, я намерен использовать возврат функции в стоимость. если использовать глобальную переменную, то я не знаю, какие значения для – George

+0

, которые вызвали функцию, вызвали значение переменной ответа, я не знаю – George

+0

Я не могу понять, что вы имеете в виду, извините, можете ли вы написать это лучше? : S, но я считаю, что единственным действительным решением для получения возвращаемого значения является вызов другой функции, которая будет обновлять ваш пользовательский интерфейс в соответствии с вашими потребностями, потому что, когда вы показываете AlertDialog, нет возможности сказать, когда диалог будет закрыт от пользователя, и вы не можете просто приостановить поток пользовательского интерфейса и дождаться возврата значения из alertDialog. Поэтому вам нужно использовать что-то вроде моего примера. – ManosProm

0

Вам необходимо показать тост в положительной и отрицательной кнопке Click event. потому что, когда вы нажимаете на кнопку, появляется предупреждение, и после этого, если условие выполняется так, что у вас есть значение из последнего открытого нажатия кнопки alertview. так что это неправильно. попробуйте это:

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

Тост сообщение - образец, реальности я использую вместо него другой код, я имею в виду просто использовать возвращаемое значение AlertDialog. – George

+0

вы не можете получить возвращаемое значение для нажатия кнопки alertbutton, не нажимая на него. поэтому вам нужно что-то сделать, нажав на кнопки с кнопкой. вызывать любую функцию при нажатии кнопки с помощью значений кнопки оповещения. –

0

В то время как вы не можете напрямую вернуть значение из AlertDialog, вы можете отправить ответ на обработчике это деятельность по:

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; 
} 
Смежные вопросы