web-dev-qa-db-ja.com

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

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;
    }
 }
89
Arun
_@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;
}
_
213
Blackbelt

次のスニペットを使用してください

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

ダイアログの外側のタッチを無効にする場合は、次のコード行を使用します

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
48
Usman Kurd

アラートビルダーを使用して(おそらくすべての場合にDialogFragment内にダイアログをラップする)ダイアログを作成する場合は、getDialog()。setCancelable(false)またはDialog.setCancelable(false)機能しないためです。以下のコードに示すように、oficial Android documentation:

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