2013-04-09 56 views
10

Làm cách nào để tắt nút OK/Hủy của DialogFragment khi nó được tạo bằng cách sử dụng AlertDialog? tôi đã cố gắng gọi myAlertDialogFragment.getDialog() nhưng nó luôn luôn quay trở lại dù chỉ một lần vô đoạn được hiển thịAndroid: tắt các nút OK/Hủy DialogFragment

public static class MyAlertDialogFragment extends DialogFragment { 

    public static MyAlertDialogFragment newInstance(int title) { 
     MyAlertDialogFragment frag = new MyAlertDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("title", title); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int title = getArguments().getInt("title"); 

     return new AlertDialog.Builder(getActivity()) 
       .setIcon(R.drawable.alert_dialog_icon) 
       .setTitle(title) 
       .setPositiveButton(R.string.alert_dialog_ok, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((FragmentAlertDialog)getActivity()).doPositiveClick(); 
         } 
        } 
       ) 
       .setNegativeButton(R.string.alert_dialog_cancel, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((FragmentAlertDialog)getActivity()).doNegativeClick(); 
         } 
        } 
       ) 
       .create(); 
    } 
} 

Tôi biết tôi có thể để nó bằng cách thổi phồng một cách bố trí có chứa cả một hủy và một nút ok, nhưng tôi khá sử dụng giải pháp AlertDialog nếu có thể

Trả lời

25

Đính kèm AlertDialog của bạn để biến:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
(initialization of your dialog) 
AlertDialog alert = builder.create(); 
alert.show(); 

Và sau đó nút nhận được từ AlertDialogand bạn thiết lập nó tắt/bật:

Button buttonNo = alert.getButton(AlertDialog.BUTTON_NEGATIVE); 
buttonNo.setEnabled(false); 

Nó cung cấp cho bạn cơ hội thay đổi thuộc tính nút khi chạy.

Sau đó, trả lại biến cảnh báo của bạn.

AlertDialog phải được hiển thị trước khi có được lượt xem.

+2

Tôi đã thử nhưng không hoạt động vì alert.getButton (AlertDialog.BUTTON_NEGATIVE); sẽ trả về null khi được gọi trước alert.show() Vì vậy, tôi không biết phải gọi nó ở đâu ... – user1026605

+8

Nó thực hiện điều đó, có (và cá nhân tôi thấy nó thực sự gây phiền nhiễu). Những gì bạn muốn làm là thực hiện cuộc gọi 'setEnabled()' ở một nơi nào đó sau trong vòng đời, có thể là sau 'onResume()'. – Delyan

23

Bạn cần ghi đè onStart() trong Hộp thoại và giữ tham chiếu đến nút. Sau đó, bạn có thể sử dụng tham chiếu để bật lại nút sau:

Button positiveButton; 

@Override 
public void onStart() { 
    super.onStart(); 
    AlertDialog d = (AlertDialog) getDialog(); 
    if (d != null) { 
     positiveButton = d.getButton(Dialog.BUTTON_POSITIVE); 
     positiveButton.setEnabled(false); 
    } 

} 
+1

Câu trả lời hay! Dù sao, bạn không cần phải đưa sự trở lại của 'd.getButton' vào một đối tượng Button. –

+0

Nó hoạt động. Không cần đúc: positiveButton = d.getButton (Dialog.BUTTON_POSITIVE); Là đủ. – Andrey