2009-05-07 14 views
5

Hôm nay tôi gặp phải một vấn đề rất lạ. Trong trò chơi của tôi, tôi tạo ra AlertDialog để hiển thị cho người dùng những thách thức cấp độ tiếp theo khi người chơi thành công. Vì vậy, mã tương ứng là như thế này. khi trò chơi thành công showDialog (R.id.display_success) được gọi và mã sau được thực hiện.Android: Không thể thay đổi văn bản xuất hiện trong AlertDialog

Vì vậy, tôi dự kiến ​​sẽ thực thi mã này trong mọi cuộc gọi. Tuy nhiên; các trò chơi được thực hiện chỉ một lần và hiển thị cùng một AlertDialog trong mỗi thực hiện khác. Ý tôi là, giống như thể hiện không được tạo ra sau khi cá thể đầu tiên được tạo ra và cá thể đầu tiên được sử dụng mọi lúc. Tôi hy vọng tôi có thể mô tả vấn đề của tôi.

case R.id.display_success:   
     updateGameSettings(); 
     message = formatLevel() 
     + formatMission(); 
     return new AlertDialog.Builder(this) 
     .setIcon(R.drawable.smiley_happy) 
     .setTitle(R.string.dialog_success) 
     .setMessage(message) 
     .setPositiveButton(R.string.alert_dialog_newgame, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,  int whichButton) { 
         startANewGame(); 
       } 
     }) 
     .setNegativeButton(R.string.exit, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        finish(); 
       } 
     }) 
     .create(); 

Trả lời

3

onPrepareDialog được gọi khi hộp thoại được hiển thị. Vì vậy, tốt hơn là thay đổi văn bản hoặc các tính năng khác bằng cách ghi đè phương thức này.

+1

Tôi nghĩ rằng bạn đã sai. Theo thiết kế, mỗi Dialog chỉ được tạo một lần. Nếu bạn muốn thay đổi nội dung của hộp thoại của bạn sử dụng onPrepareDialog, được gọi là mọi lúc hộp thoại của bạn sắp xuất hiện. Mã được cung cấp có thể hoạt động, nhưng nó không phải là cách ưu tiên để làm điều đó. –

+0

Tôi đặt 'removeDialog' trong câu lệnh try try. Các mã hoạt động, nhưng tôi rất nhiều nghi ngờ đó là cách đúng để làm điều đó –

+0

@Tim, vâng tôi sai. Tôi đã học được điều này sau này rằng onPrepareDialog được gọi mỗi khi hộp thoại được tạo ra. –

4

Tôi nghĩ rằng tôi có bản sửa lỗi cho hành vi không nhất quán của onPrepareDialog. Khi ban đầu tạo hộp thoại (khi nó vẫn là một AlertDialog.Builder), bạn phải đặt thông báo về trạng thái ban đầu (không null) hoặc onPrepareDialog sẽ KHÔNG ghi đè thông điệp với giá trị dự định. Vì vậy, khi bạn đang tạo hộp thoại, hãy làm như thế này để luôn có giá trị không null trong thông báo. Tôi đã vật lộn với điều này trong nhiều ngày và tìm thấy giải pháp này một cách tình cờ:

AlertDialog.Builder resultAlert = new AlertDialog.Builder(context); 

if (message == null) { 
    resultAlert.setMessage(""); 
} else { 
    resultAlert.setMessage(message); 
} 
+0

Tuyệt vời, hoạt động! Mặc dù vì một số lý do, nó không hoạt động cho tiêu đề của hộp thoại ... – matt

Các vấn đề liên quan