web-dev-qa-db-ja.com

Androidのアクティビティダイアログが外側のタッチで閉じないようにする

Theme.Dialogスタイルを使用しているアクティビティがあり、それが別のアクティビティの上に浮かぶウィンドウになっています。ただし、ダイアログウィンドウの外側(背景のアクティビティ)をクリックすると、ダイアログが閉じます。どうすればこの動作を止めることができますか?

185
Fergusmac

これは役に立ちます。これは、イベント外のタッチを処理する方法です。

ウィンドウの外側に触れたときにアクティビティをテーマにしたダイアログをキャンセルするには?

イベントをキャッチして何もしないことによって、私はあなたが閉会を防ぐことができると思います。しかし奇妙なのは、あなたがアクティビティダイアログのデフォルトの振る舞いは、あなたが外に触れたときにそれ自身を閉じるためにnotであるべきであるということです。

(PS:コードはWindowManager.LayoutParamsを使います)

32

戻るキーが押されたときにダイアログボックスが閉じられないようにするには、これを使います。

dialog.setCancelable(false);

ダイアログボックスが外側のタッチで閉じられないようにするには、これを使用します。

 dialog.setCanceledOnTouchOutside(false);
370
Singhak

実際に持っているのは(ダイアログのように見えても)アクティビティです。そのため、バックグラウンドアクティビティがクリックされたときに開いたままにしたい場合は、アクティビティからsetFinishOnTouchOutside(false)を呼び出す必要があります。

編集:これはAndroidのAPIレベル11以上でのみ動作します

113
artex

私にとってうまくいったのは、DialogFragmentを作成してキャンセルできないように設定することでした。

dialog.setCancelable(false);
52
Petr

高いAPI 10では、外側に触れるとダイアログは消えますが、API 11より低いと、ダイアログは消えません。これを防ぐために、あなたはする必要があります:

styles.xml内:<item name="Android:windowCloseOnTouchOutside">false</item>

OR

onCreate()メソッドでは、次のように使用します。this.setFinishOnTouchOutside(false);

注:API 10以下では、このメソッドは効果がなく、必要ではありません。

17
ilw

OnCreateでダイアログをアクティビティとして使用する場合は、これを追加してください。

setFinishOnTouchOutside(false);
14
Ronny Shibley

私のために働いているこのコードを使う

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
 alertDialog.setCancelable(false);

12
Aslam Patel

ダイアログのキャンセル可能をfalseに設定するだけで十分です。警告ダイアログの外側をタッチするか、戻るボタンをクリックすると、警告ダイアログが消えます。だからこれを使用してください:

setCancelable(false)

そして他の機能はもう必要ではありません:dialog.setCanceledOnTouchOutside(false);

あなたが一時的なダイアログを作成していて、このコード行を入れることをそこに思っているならば、これは例です:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(Android.R.string.yes, null).show();
11
BillOverFlow
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

ダイアログの詳細については、このリンクを参照してください。

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity
8
anand krish

単に、

alertDialog.setCancelable(false);

ユーザーがダイアログボックスの外側をクリックできないようにします。

8
user7868389

API> 11の場合はsetFinishOnTouchOutside(false)を使用してください。Androidのデフォルトの動作テーマのダイアログはAPI <11 :)の外部タッチでは完了しないため、心配しないでください。

5
Vishal Pandey

私はこれをonCreate()で使っています。Androidのどのバージョンでも動作するようです。 5.0と4.4.xでテストされていて、Gingerbreadでテストすることはできません、Samsungデバイス(注1)はデフォルトでこのようにしています:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);
5
3c71
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

私はこれがあなたを助けるだろうと思います。

4
user2532065

これが私の解決策です:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);

OnCancelListenerを実装するさまざまなアクションを割り当てることも可能です。

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});
2
Adae Rodríguez

私は同じ問題に直面していました。それを処理するために、私はダイアログにOntouchListenerを設定し、内部では何もしません。しかしDialogも画面を回転させると消えます。それを修正するために、ダイアログが正常に閉じられたかどうかを知らせる変数を設定しました。それから私は自分のダイアログにOnDismissListenerを設定し、その中で変数をチェックします。ダイアログが正常に却下された場合、私は邪魔しないでください、そうでなければ私は再びダイアログを実行します(そして私の場合は却下したときのように彼の状態を設定します)。

1
Madara

builder.setCancelable(false);


public void Mensaje(ビューv){

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}