DialogFragment setCancelable thuộc tính không hoạt động


101

Tôi đang làm việc trong một ứng dụng Android và đang sử dụng DialogFragment để hiển thị hộp thoại và tôi muốn không hủy được DialogFragment đó. Tôi đã đặt thuộc tính có thể hủy hộp thoại thành false, nhưng nó vẫn không ảnh hưởng.

Vui lòng xem mã của tôi và đề xuất cho tôi một giải pháp.

public class DialogTest extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return super.onCreateDialog(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_test, container, true);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        getDialog().setCancelable(false);

        return view;
    }
 }

28
thay vì getDialog (). setCancelable (false); bạn nên gọi setCancelable (false);
Blackbelt

nếu bạn nhấp vào bên ngoài giới hạn của hộp thoại, nó cũng phải được loại bỏ?
Usman Kurd

? Bạn đang cố gắng trong bánh sandwich kem Vui lòng tham khảo liên kết nêu fantasypublishings.com/morePhpHelp/...
Remmyabhavan

Câu trả lời:


238
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    getDialog().setCancelable(false);

    return view;
}

thay vì getDialog().setCancelable(false);bạn phải sử dụng trực tiếpsetCancelable(false);

vì vậy câu trả lời được cập nhật sẽ như thế này

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    setCancelable(false);

    return view;
}

Đó là một mẹo thực sự đáng kinh ngạc, CẢM ƠN. Tôi tự hỏi tại sao, với nói hộp thoại.getWindow (). RequestFeature (-) bạn phải "bao gồm hộp thoại" trên getWindow?
Fattie

7
Nó không phải là một mẹo. Một phân đoạn đang bao bọc hộp thoại của bạn, điều bình thường là bạn phải xử lý phân mảnh đó thay vì chính hộp thoại;)
andrea.rinaldi

1
Trong trường hợp bạn không ghi đè lên onCreateView, các setCancelable (false) cũng có thể được gọi từ công chúng Dialog onCreateDialog (Bundle savedInstanceState)
user2924714

2
Không làm việc cho tôi. Hộp thoại vẫn bị loại bỏ khi nhấp vào nút quay lại.
Pinkesh Darji

@Blackbelt Tôi có một trường hợp sử dụng tương tự nhưng trong trường hợp của tôi, một thao tác chạm bên ngoài hộp thoại không loại bỏ hộp thoại. Tôi đang sử dụng DatePicker trong DialogFragment. Tôi sẽ sử dụng gì cho "R.layout.dialog_test" trong câu trả lời của bạn ở trên? Câu hỏi đầy đủ của tôi được liệt kê ở đây: stackoverflow.com/questions/59825258/…
AJW

51

Sử dụng đoạn mã sau

void showDialog() {
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
            R.string..alert_dialog_two_buttons_title);
    newFragment.setCancelable(false);
    newFragment.show(getFragmentManager(), "dialog");
}

và nếu bạn muốn tắt hộp thoại cảm ứng bên ngoài, hãy sử dụng dòng mã sau

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
Đây phải là câu trả lời được chấp nhận vì nó có thể áp dụng cho cả các đoạn hộp thoại cảnh báo vani và các đoạn hộp thoại tùy chỉnh.
Ganesh Mohan

29

Trong trường hợp bạn sử dụng trình tạo cảnh báo (và có thể trong mọi trường hợp bạn bọc hộp thoại bên trong DialogFragment) để tạo hộp thoại của mình, vui lòng không sử dụng getDialog (). SetCancelable (false) hoặc Dialog.setCancelable (false) vì nó sẽ không công việc. Sử dụng setCancelable (false) như được hiển thị trong mã bên dưới vì nó được đề cập trong tài liệu Android của bộ tư pháp:

public void setCancelable (boolean cancelable)

Đã thêm vào API cấp 11 Kiểm soát xem Hộp thoại được hiển thị có thể hủy được hay không. Sử dụng điều này thay vì gọi trực tiếp Dialog.setCancelable (boolean), vì DialogFragment cần phải thay đổi hành vi của nó dựa trên điều này. "

ref: http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.dialog_layout, null, false);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                .setTitle("in case you want use a title").setView(view);

        AlertDialog alert = builder.create();
        // alert.setCancelable(false); <-- dont' use that instead use bellow approach
        setCancelable(false); <-  press back button not cancel dialog, this one works fine
        alert.setCanceledOnTouchOutside(false); <- to cancel outside touch

        return alert;
}

Có, tôi đã thử giải pháp trên, ngay cả giải pháp đã được kiểm tra nhưng không hoạt động với tôi, câu trả lời đó là mới nên cần thời gian để được ủng hộ, Dù sao cũng cảm ơn.
Xenione

Điều này đúng, ngay cả khi tôi nghĩ rằng hành vi này từ phía Android là khá lạ, vì bạn sử dụng rõ ràng ví dụ AlertDialog.Builder để tạo hộp thoại của mình, bạn sẽ nghĩ rằng các thuộc tính đó ghi đè các lớp con. Nhưng tôi có thể thiếu một cái gì đó ở đây?
Robert

Tôi nghĩ rằng hành vi hộp thoại sau khi được bao bọc trong một phân đoạn hộp thoại sẽ không phản hồi với AlertDialog nữa hoặc lúc đầu. Thay vào đó, tôi nghĩ rằng tất cả diễn ra thông qua mảnh vỡ.
Xenione

Cảm ơn! Tôi đã sử dụng alert.setCancelable (false) trong suốt thời gian này và không hiểu tại sao nó không hoạt động.
Aldo

0

Giải pháp đơn giản trong DialogFragment

Đã sử dụng

dialog.setCanceledOnTouchOutside(false)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.