Theme.Dialogスタイルを使用しているアクティビティがあり、それが別のアクティビティの上に浮かぶウィンドウになっています。ただし、ダイアログウィンドウの外側(背景のアクティビティ)をクリックすると、ダイアログが閉じます。どうすればこの動作を止めることができますか?
これは役に立ちます。これは、イベント外のタッチを処理する方法です。
ウィンドウの外側に触れたときにアクティビティをテーマにしたダイアログをキャンセルするには?
イベントをキャッチして何もしないことによって、私はあなたが閉会を防ぐことができると思います。しかし奇妙なのは、あなたがアクティビティダイアログのデフォルトの振る舞いは、あなたが外に触れたときにそれ自身を閉じるためにnotであるべきであるということです。
(PS:コードはWindowManager.LayoutParamsを使います)
戻るキーが押されたときにダイアログボックスが閉じられないようにするには、これを使います。
dialog.setCancelable(false);
ダイアログボックスが外側のタッチで閉じられないようにするには、これを使用します。
dialog.setCanceledOnTouchOutside(false);
実際に持っているのは(ダイアログのように見えても)アクティビティです。そのため、バックグラウンドアクティビティがクリックされたときに開いたままにしたい場合は、アクティビティからsetFinishOnTouchOutside(false)
を呼び出す必要があります。
編集:これはAndroidのAPIレベル11以上でのみ動作します
私にとってうまくいったのは、DialogFragment
を作成してキャンセルできないように設定することでした。
dialog.setCancelable(false);
高いAPI 10では、外側に触れるとダイアログは消えますが、API 11より低いと、ダイアログは消えません。これを防ぐために、あなたはする必要があります:
styles.xml
内:<item name="Android:windowCloseOnTouchOutside">false</item>
OR
onCreate()
メソッドでは、次のように使用します。this.setFinishOnTouchOutside(false);
注:API 10以下では、このメソッドは効果がなく、必要ではありません。
OnCreateでダイアログをアクティビティとして使用する場合は、これを追加してください。
setFinishOnTouchOutside(false);
私のために働いているこのコードを使う
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setCancelable(false);
ダイアログのキャンセル可能を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();
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
単に、
alertDialog.setCancelable(false);
ユーザーがダイアログボックスの外側をクリックできないようにします。
API> 11の場合はsetFinishOnTouchOutside(false)
を使用してください。Androidのデフォルトの動作テーマのダイアログはAPI <11 :)の外部タッチでは完了しないため、心配しないでください。
私はこれを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);
alert.setCancelable(false);
alert.setCanceledOnTouchOutside(false);
私はこれがあなたを助けるだろうと思います。
これが私の解決策です:
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
}
});
私は同じ問題に直面していました。それを処理するために、私はダイアログにOntouchListener
を設定し、内部では何もしません。しかしDialogも画面を回転させると消えます。それを修正するために、ダイアログが正常に閉じられたかどうかを知らせる変数を設定しました。それから私は自分のダイアログにOnDismissListener
を設定し、その中で変数をチェックします。ダイアログが正常に却下された場合、私は邪魔しないでください、そうでなければ私は再びダイアログを実行します(そして私の場合は却下したときのように彼の状態を設定します)。
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();
}