2013-02-12 40 views
5

Tôi có một AlertDialog với bố cục tùy chỉnh (chỉ là EditText) và tôi muốn xác thực dữ liệu khi nhấn nút OK. Nếu xác thực không thành công, tôi không muốn đóng hộp thoại.Android AlertDialog với DialogFragment: không đóng hộp thoại ngay cả khi OK được nhấp

Tôi đang sử dụng các nút mặc định của hộp thoại (dương và âm). Nếu tôi sử dụng "setPositiveButton (" ", hộp thoại mới DialogInterface.OnClickListener() ..." hộp thoại luôn đóng. Tôi đã xem một số bài đăng và họ nói rằng trình nghe onClick phải được ghi đè, nhưng tôi không thể làm việc đó . Đây là mã tôi thấy:

Button theButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); 
theButton.setOnClickListener(new CustomListener(dialog)); 

Kể từ khi nó nói nó nên được thực hiện sau khi hiển thị hộp thoại tôi đặt mã này trong hoạt động của tôi, không phải bên DialogFragment của tôi, nhưng nếu tôi sử dụng mDialogFragment.getDialog() nó luôn luôn trả về null

Đây là một phần của Fragment Dialog của tôi:.

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    builder.setTitle(R.string.new); 

    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    dialogView = inflater.inflate(R.layout.edit_license, null); 

    builder.setView(dialogView) 

    // Add action buttons 
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int id) { 

     } 
    }) 
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      MyDialogFragment.this.getDialog().cancel(); 
     } 
    }); 

    return builder.create(); 

} 

Và trong Hoạt động của tôi, tôi làm như sau:

DialogFragment dialog = new MyDialogFragment(true, null); 
dialog.show(getSupportFragmentManager(), "EditLicenseDialogFragment"); 

AlertDialog alertDialog = (AlertDialog)dialog.getDialog(); 
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
btnPositive.setOnClickListener(new CustomListener(alertDialog)); 

... 

class CustomListener implements View.OnClickListener { 
    private final Dialog dialog; 
    public CustomListener(Dialog dialog) { 
     this.dialog = dialog; 
    } 
    @Override 
    public void onClick(View v) { 
     ... 
    } 
} 

Như tôi đã nói, (AlertDialog) dialog.getDialog(); luôn trả về null. Tại sao vậy? Làm thế nào tôi có thể tránh đóng hộp thoại nếu xác thực không ổn?

Cảm ơn!

Trả lời

3

đây là một số văn bản từ tài liệu tham khảo của DialogFragment:

Một mảnh đó sẽ hiển thị một cửa sổ hộp thoại, nổi trên cùng của cửa sổ hoạt động của nó. Đoạn này chứa một đối tượng Dialog, mà nó hiển thị thích hợp dựa trên trạng thái của đoạn. Điều khiển của hộp thoại (quyết định khi nào hiển thị, ẩn, bỏ qua) nên được thực hiện thông qua API tại đây, không phải với các cuộc gọi trực tiếp trên hộp thoại.

Thay vì gọi getDialog(). Sa thải() bạn phải làm bỏ()

+0

Thú vị. Và những gì về chức năng getButton? Nó không phải là trên DialogFragment, và nếu tôi cố gắng để có được Dialog nó trả về null. –

+3

Hộp thoại trả về null vì mDialog được trả về bởi getDialog không được tạo (chưa). Giải pháp sẽ là thực hiện các phương pháp vòng đời khác bên trong DialogFragment xảy ra sau hàm onCreateDialog/show. Nhưng điều này không thực sự là một vấn đề cho bạn chỉ cần xác định clickListener bên trong hộp thoại (như bây giờ). Nhưng không thực hiện các hoạt động hộp thoại trên hộp thoại nhưng trên hộp thoại, với điều này bạn không cần phải gọi getDialog() – Tobrun

4

Giải pháp này làm việc cho tôi. Hộp thoại đã được hiển thị trong onResume vì vậy đây là một nơi tốt để truy cập vào các nút và thay thế người nghe.

public class XYZFragment extends DialogFragment { 
    ... 

    @Override 
    public void onResume() { 
     super.onResume(); 

     AlertDialog dialog = (AlertDialog)getDialog(); 

     Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); 
     positiveButton.setOnClickListener(new View.OnClickListener() {     
      @Override 
      public void onClick(View onClick) { 
      ... 
      } 
     }); 
    } 
} 
+0

Tôi không thấy nút ok ngay bây giờ –

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