Theme.Dialog スタイルを使用しているアクティビティがあり、別のアクティビティの上にフローティング ウィンドウが表示されます。ただし、ダイアログ ウィンドウの外側 (バックグラウンド アクティビティ) をクリックすると、ダイアログが閉じます。どうすればこの動作を停止できますか?
19 に答える
実際に持っているのは (ダイアログのように見えても) アクティビティであるためsetFinishOnTouchOutside(false)
、バックグラウンド アクティビティがクリックされたときにアクティビティを開いたままにしておく場合は、アクティビティから呼び出す必要があります。
編集: これは Android API レベル 11 以降でのみ機能します
これはあなたを助けることができます。これは touch outside イベントを処理する方法です:
ウィンドウの外側に触れたときにアクティビティのようなテーマのダイアログをキャンセルするには?
イベントをキャッチして何もしないことで、閉鎖を防ぐことができると思います。しかし奇妙なことに、アクティビティ ダイアログのデフォルトの動作は、外側に触れても閉じないようにする必要があります。
(PS: コードは WindowManager.LayoutParams を使用します)
API 10 以上では外側をタッチするとダイアログが消えますが、API 11 以下ではダイアログは消えません。これを防ぐには、次のことを行う必要があります。
でstyles.xml
:<item name="android:windowCloseOnTouchOutside">false</item>
また
onCreate()
メソッドでは、次を使用します。this.setFinishOnTouchOutside(false);
注: API 10 以前の場合、このメソッドは効果がなく、必要ありません。
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();
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
私は 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);
alert.setCancelable(false);
alert.setCanceledOnTouchOutside(false);
私はこれがあなたを助けると思います.それは私のために働いた
API > 11 に使用setFinishOnTouchOutside(false)
します。アクティビティをテーマにしたダイアログが API < 11 の外部タッチで終了しないという Android のデフォルトの動作のため、心配する必要はありません :) !!Cheerss!!
これが私の解決策です:
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
に、ダイアログに a を設定し、内部では何もしません。ただし、画面を回転させるとダイアログも閉じます。それを修正するために、ダイアログが正常に閉じられたかどうかを知らせる変数を設定しました。次にOnDismissListener
、ダイアログに a を設定し、内部で変数をチェックします。ダイアログが正常に破棄された場合、私は何もしません。そうでない場合は、ダイアログを再度実行します(私の場合は破棄するときのように状態を設定します)。
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();
}
これはあなたのすべての質問に対する完璧な答えです.... 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();