DialogFragment setCancelableプロパティが機能しない


101

私はAndroidアプリケーションで作業しており、DialogFragmentを使用してダイアログを表示しています。そのDialogFragmentをキャンセルできないようにしたいと考えています。ダイアログのキャンセル可能なプロパティをfalseにしましたが、まだ影響はありません。

私のコードを調べて、解決策を提案してください。

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 2013年

ダイアログの境界の外をクリックすると、それも非表示にする必要がありますか?
Usman Kurd 2013年

アイスクリームサンドイッチを試していますか?記載されているリンクを参照してください。fantasypublishings.com
morePhpHelp /

回答:


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

代わりに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;
}

それは本当に素晴らしいヒントです、ありがとう。say dialog.getWindow()。requestFeature(-)では、なぜgetWindowに「ダイアログを含める」必要があるのでしょうか。
Fattie

7
ヒントではありません。フラグメントがダイアログをラップしています。ダイアログ自体ではなくフラグメントを処理する必要があるのは通常のことです;)
andrea.rinaldi '13年

1
onCreateViewをオーバーライドしない場合、setCancelable(false)はpublic Dialog onCreateDialog(Bundle savedInstanceState)
user2924714

2
私のために働いていません。戻るボタンをクリックするとダイアログが閉じます。
Pinkesh Darji 2018年

@Blackbelt同様の使用例がありますが、私の場合、ダイアログの外側をタッチしてもダイアログが閉じません。DialogFragment内でDatePickerを使用しています。上記の回答の「R.layout.dialog_test」には何を使用しますか?私の完全な質問はここにリストされています stackoverflow.com/questions/59825258/...
AJW

51

次のスニペットを使用します

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
これは、バニラアラートダイアログフラグメントとカスタムダイアログフラグメントの両方に適用できるので、受け入れられる答えになるはずです。
ガネーシャモハン

29

アラートビルダー(そしておそらくすべてのケースでは、あなたがDialogFragment内のダイアログをラップ)の構築を支援するあなたのダイアログを使用する場合には、getDialog()。setCancelable(偽)またはDialog.setCancelable(false)を使用しないでください、それはするつもりはないので作業。 公式のAndroidドキュメントで言及されているように、以下のコードに示すようにsetCancelable(false)を使用します。

public void setCancelable (boolean cancelable)

APIレベル11で追加。表示されているダイアログをキャンセルできるかどうかを制御します。DialogFragmentはこれに基づいて動作を変更する必要があるため、Dialog.setCancelable(boolean)を直接呼び出す代わりにこれを使用してください。」

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

はい私は上記の解決策を試しましたが、チェックしたものでもうまくいきませんでした。その答えは新しいので、賛成するために時間が必要です。とにかくありがとう。
Xenione 2014

確かにこれは真実です。たとえAndroid側からのこの動作が非常に奇妙だと私が考えている場合でも、たとえばAlertDialog.Builderを明示的に使用してダイアログを構築すると、それらの属性がサブクラスをオーバーライドすると考えるでしょう。しかし、ここで何か不足しているのでしょうか?
Robert

ダイアログフラグメントにラップされた後のダイアログの動作は、AlertDialogに応答しなくなった、または大きくなりすぎたと思います。代わりに、すべてがfragmentDialogを通過すると思います。
Xenione 2014

ありがとう!この間ずっとalert.setCancelable(false)を使用していて、なぜ機能しないのか理解できませんでした。
アルド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.