DialogFragment set คุณสมบัติที่ยกเลิกได้ไม่ทำงาน


103

ฉันกำลังทำงานในแอปพลิเคชัน Android และกำลังใช้ DialogFragment เพื่อแสดงกล่องโต้ตอบและฉันต้องการทำให้ DialogFragment นั้นไม่สามารถยกเลิกได้ ฉันได้ทำให้คุณสมบัติที่ยกเลิกการโต้ตอบเป็นเท็จ แต่ก็ยังไม่ส่งผลกระทบ

โปรดตรวจสอบรหัสของฉันและแนะนำวิธีแก้ปัญหาให้ฉัน

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
แทน getDialog (). setCancelable (false); คุณควรเรียก setCancelable (false);
Blackbelt

ถ้าคุณคลิกนอกขอบเขตของกล่องโต้ตอบมันจะต้องถูกตัดออกด้วย?
Usman Kurd

คุณกำลังลองไอศครีมแซนวิชหรือไม่โปรดดูลิงค์ที่กล่าวถึงfantasypublishings.com/morePhpHelp/…
Remmyabhavan

คำตอบ:


240
@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;
}

แทนที่จะgetDialog().setCancelable(false);ต้องใช้โดยตรงsetCancelable(false);

ดังนั้นคำตอบที่อัปเดตจะเป็นเช่นนี้

@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;
}

นั่นเป็นเคล็ดลับที่เหลือเชื่อจริงๆขอบคุณ ฉันสงสัยว่าทำไมถึงพูดว่าdialog.getWindow (). requestFeature (-)คุณต้อง "รวมกล่องโต้ตอบ" บน getWindow?
Fattie

7
มันไม่ใช่ทิป ส่วนย่อยกำลังห่อกล่องโต้ตอบของคุณเป็นเรื่องปกติที่คุณจะต้องจัดการกับส่วนแทนที่จะเป็นกล่องโต้ตอบเอง;)
andrea.rinaldi

1
ในกรณีที่คุณไม่ได้แทนที่ onCreateView ก็สามารถเรียก setCancelable (false) ได้จาก Dialog สาธารณะ onCreateDialog (Bundle savedInstanceState)
user2924714

2
ไม่ทำงานสำหรับฉัน กล่องโต้ตอบยังคงถูกปิดเมื่อคลิกปุ่มย้อนกลับ
Pinkesh Darji

@Blackbelt ฉันมีกรณีการใช้งานที่คล้ายกัน แต่ในกรณีของฉันการสัมผัสนอกกล่องโต้ตอบไม่ได้ปิดกล่องโต้ตอบ ฉันใช้ DatePicker ภายใน DialogFragment ฉันจะใช้อะไรสำหรับ "R.layout.dialog_test" ในคำตอบของคุณด้านบน คำถามเต็มของฉันอยู่ที่นี่: stackoverflow.com/questions/59825258/…
AJW

52

ใช้ Snippet ต่อไปนี้

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

และหากคุณต้องการปิดใช้งานการสัมผัสด้านนอกรอบ ๆ กล่องโต้ตอบให้ใช้โค้ดบรรทัดต่อไปนี้

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากใช้ได้กับทั้งชิ้นส่วนกล่องโต้ตอบการแจ้งเตือนวานิลลาและชิ้นส่วนโต้ตอบที่กำหนดเอง
Ganesh Mohan

29

ในกรณีที่คุณใช้ตัวสร้างการแจ้งเตือน (และในทุกกรณีที่คุณรวมกล่องโต้ตอบไว้ใน DialogFragment) เพื่อช่วยสร้างกล่องโต้ตอบของคุณโปรดอย่าใช้ getDialog () setCancelable (false) หรือ Dialog.setCancelable (false) เนื่องจากจะไม่ งาน. ใช้ setCancelable (false) ตามที่แสดงในโค้ดด้านล่างตามที่ระบุไว้ในเอกสารประกอบของ Android:

public void setCancelable (boolean cancelable)

เพิ่มใน API ระดับ 11 ควบคุมว่ากล่องโต้ตอบที่แสดงนั้นสามารถยกเลิกได้หรือไม่ ใช้สิ่งนี้แทนการเรียก Dialog.setCancelable (บูลีน) โดยตรงเนื่องจาก DialogFragment จำเป็นต้องเปลี่ยนลักษณะการทำงานตามนี้ "

อ้างอิง: 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;
}

ใช่ฉันลองวิธีแก้ปัญหาข้างต้นแม้แต่วิธีที่เลือกไว้ แต่ก็ไม่ได้ผลสำหรับฉันคำตอบนั้นใหม่ดังนั้นต้องใช้เวลาในการโหวตขอบคุณ
Xenione

นี่เป็นเรื่องจริงแม้ว่าฉันจะคิดว่าพฤติกรรมนี้จากฝั่งของ Android นั้นค่อนข้างแปลกเนื่องจากคุณใช้ตัวอย่างเช่น AlertDialog อย่างชัดเจน Builder เพื่อสร้างกล่องโต้ตอบของคุณคุณจะคิดว่าแอตทริบิวต์เหล่านั้นแทนที่คลาสย่อย แต่ฉันอาจจะพลาดอะไรบางอย่างที่นี่?
Robert

ฉันคิดว่าพฤติกรรมการโต้ตอบหลังจากถูกรวมไว้ในส่วนของไดอะล็อกไม่ตอบสนองต่อ AlertDialog อีกต่อไปหรือที่ Leat ที่ใหญ่โต ฉันคิดว่าทั้งหมดผ่าน FragmentDialog แทน
Xenione

ขอบคุณ! ฉันใช้ alert.setCancelable (false) ทั้งหมดนี้และไม่เข้าใจว่าทำไมมันถึงใช้ไม่ได้
Aldo

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.