2013-07-27 31 views
5

Trong hầu hết trường hợp, tôi cần người dùng thực hiện nhiều lựa chọn (tôi làm điều gì đó và nâng cao hộp thư để người dùng lựa chọn và tiếp tục làm việc khác (có thể được gọi là chặn))) Vì vậy, tôi đã viết một chức năng chungLàm thế nào để sử dụng giá trị trả về của AlertDialog

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

Mặc dù hưởng ứng một cách chính xác hành động của người dùng, nhưng luôn luôn xem xét (có nghĩa là trong khi tôi nhấp vào nút, giá trị hành động trước đó có thể nhìn thấy bằng giá trị toàn cầu biến của) có tồn tại bất kỳ chức năng nào mà tôi có thể nhận được giá trị trả về của hộp thư và sử dụng nó như sau:

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

tiếp theo là mã của tôi:

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



} 

Trả lời

7

Tôi không nghĩ rằng có bất kỳ cách nào để có được một giá trị từ một alertDialog như thế này

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

bởi vì thời gian thoại của bạn sẽ hiển thị nút onClick() của nút của bạn sẽ hoàn tất.

Vì vậy, tôi khuyên bạn nên sử dụng một cách khác để thực hiện việc này.

Kể từ khi phương pháp để tạo ra các alertDialog là bên trong hoạt động của bạn đó là dễ dàng như việc tạo ra một chức năng trong hoạt động của bạn như dưới đây:

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

} 

và gọi phương thức của bạn trong onClick()

như thế này :

 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

chức năng khác nhau, tôi có ý định sử dụng trả về của hàm giá trị. nếu sử dụng biến toàn cục, thì tôi không biết giá trị nào cho – George

+0

gọi hàm nào làm giá trị của biến trả lời, tôi không biết – George

+0

tôi không thể hiểu ý của bạn là gì, bạn có thể viết nó tốt hơn không? : S, nhưng tôi tin rằng giải pháp hợp lệ duy nhất để có được giá trị trả về là bằng cách gọi một hàm khác sẽ cập nhật giao diện người dùng của bạn theo nhu cầu của bạn, bởi vì khi bạn hiển thị AlertDialog thì không có cách nào để biết khi nào hộp thoại sẽ đóng từ người dùng và bạn không thể chỉ tạm dừng Giao diện người dùng và đợi cho đến khi một giá trị từ alertDialog được trả về. Vì vậy, bạn cần phải sử dụng một cái gì đó giống như ví dụ của tôi. – ManosProm

0

Bạn cần hiển thị bánh mì nướng trong nút Tích cực và tiêu cực Nhấp vào sự kiện. bởi vì khi bạn bấm vào nút cảnh báo cho thấy lên và sau đó nếu điều kiện thực hiện để bạn có giá trị từ cuối cùng mở nút xem cảnh báo. vì vậy nó là sai. thử này:

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

Bánh mì nướng một tin nhắn là một mẫu, thực tế tôi sử dụng mã khác để thay vào đó, tôi có nghĩa là chỉ cần sử dụng giá trị trả về của AlertDialog. – George

+0

bạn không thể nhận được giá trị trả lại cho nút bấm cảnh báo mà không cần nhấp vào nó. vì vậy bạn cần phải làm điều gì đó trên các nút bấm cảnh báo. gọi bất kỳ chức năng nào trên các lần nhấp nút có các giá trị nút cảnh báo. –

0

Trong khi bạn không thể trực tiếp trả về một giá trị từ một AlertDialog, bạn có thể gửi câu trả lời cho điều khiển của một hoạt động:

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; 
} 
Các vấn đề liên quan