257

Theme.Dialog スタイルを使用しているアクティビティがあり、別のアクティビティの上にフローティング ウィンドウが表示されます。ただし、ダイアログ ウィンドウの外側 (バックグラウンド アクティビティ) をクリックすると、ダイアログが閉じます。どうすればこの動作を停止できますか?

4

19 に答える 19

127

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

編集: これは Android API レベル 11 以降でのみ機能します

于 2013-04-03T15:18:56.307 に答える
34

これはあなたを助けることができます。これは touch outside イベントを処理する方法です:

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

イベントをキャッチして何もしないことで、閉鎖を防ぐことができると思います。しかし奇妙なことに、アクティビティ ダイアログのデフォルトの動作は、外側に触れても閉じないようにする必要があります。

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

于 2012-08-24T03:32:08.863 に答える
18

API 10 以上では外側をタッチするとダイアログが消えますが、API 11 以下ではダイアログは消えません。これを防ぐには、次のことを行う必要があります。

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

また

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

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

于 2014-04-20T22:00:01.340 に答える
17

dialog cancelable を 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();
于 2015-11-04T02:42:41.023 に答える
14
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
于 2015-02-06T09:20:15.737 に答える
6

私は onCreate() でこれを使用します。Android のどのバージョンでも動作するようです。5.0 および 4.4.x でテスト済み、Gingerbread ではテストできません。

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

    super.onCreate(savedInstanceState);
于 2014-12-16T19:34:54.340 に答える
5
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

私はこれがあなたを助けると思います.それは私のために働いた

于 2015-09-14T02:38:58.210 に答える
5

API > 11 に使用setFinishOnTouchOutside(false)します。アクティビティをテーマにしたダイアログが API < 11 の外部タッチで終了しないという Android のデフォルトの動作のため、心配する必要はありません :) !!Cheerss!!

于 2014-08-25T03:45:41.427 に答える
3

これが私の解決策です:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select The Difficulty Level");
builder.setCancelable(false);
于 2016-04-12T04:37:32.430 に答える
2

onCancelListener を実装する別のアクションを割り当てることも可能です。

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});
于 2015-09-21T14:33:07.627 に答える
1

私は同じ問題に直面していました。それを処理するためOntouchListenerに、ダイアログに a を設定し、内部では何もしません。ただし、画面を回転させるとダイアログも閉じます。それを修正するために、ダイアログが正常に閉じられたかどうかを知らせる変数を設定しました。次にOnDismissListener、ダイアログに a を設定し、内部で変数をチェックします。ダイアログが正常に破棄された場合、私は何もしません。そうでない場合は、ダイアログを再度実行します(私の場合は破棄するときのように状態を設定します)。

于 2014-02-06T15:47:46.510 に答える
1

builder.setCancelable(false);


public void Mensaje(View 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();
}
于 2016-07-12T23:24:32.833 に答える
-2

これはあなたのすべての質問に対する完璧な答えです.... Android でのコーディングを楽しんでいただければ幸いです。

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();
于 2018-04-22T07:30:51.000 に答える