Intereting Posts
Android Studio – невозможно перезагрузить список AVD (d: скин) Получите уведомление о отправленном письме в onActivityResult «Android» Где com.google.android.gcm.GCMBaseIntentService? Изменение платного Android-приложения для бесплатного использования в App Billing – дедушка существующих клиентов Как создать новый макет для проекта Android (с использованием Eclipse) Определение размера представления Android во время выполнения Получить формат контактов E64 в Android API менее 16 Как передать значение с одного действия на другое в Android? Студия Android не позволяет мне установить платформу Android SDK Что такое «serviceAccountKey.json», о котором идет речь в учебнике по уведомлениям устройства Firebase от устройства к устройству Ошибка System.loadLibrary () Получать обновленный счет строк из SQLite в Android с использованием необработанного запроса? Слушайте входящие сообщения / уведомления Whatsapp Андроидная библиотека со специфической зависимостью от продукта Доступ к датчикам Android через NDK

Коснитесь диалогового окна Android, чтобы отклонить его?

Мне было интересно, можно ли каким-то образом выйти за пределы всплывающего диалогового окна (или «Активность с диалоговой темой») и отклонить его, просто нажав на него?

Я сделал краткий обзор, чтобы проиллюстрировать это:

Введите описание изображения здесь

Как правило, вам нужно нажать клавишу «Назад», чтобы закрыть диалоговые окна, но на Honeycomb может быть здорово иметь возможность просто выходить за пределы диалогового окна из-за всего свойства экрана.

Solutions Collecting From Web of "Коснитесь диалогового окна Android, чтобы отклонить его?"

Мое приложение – это одно действие с Theme.Holo.Dialog. В моем случае другой ответ не сработал. Это сделало другие фоновые приложения или экран запуска для получения событий касания.

Я обнаружил, что использование dispatchTouchEvent работает в моем случае. Я думаю, что это также более простое решение. Вот пример кода, как использовать его для обнаружения кранов вне активности с помощью темы «Диалог»:

@Override public boolean dispatchTouchEvent(MotionEvent ev) { Rect dialogBounds = new Rect(); getWindow().getDecorView().getHitRect(dialogBounds); if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) { // Tapped outside so we finish the activity this.finish(); } return super.dispatchTouchEvent(ev); } 
 dialog.setCanceledOnTouchOutside(true) 

Устанавливает, отменяется ли это диалоговое окно при касании вне границ окна.

Существует метод TouchInterceptor который TouchInterceptor , когда вы касаетесь боковой части всплывающего окна

Например

 mWindow.setTouchInterceptor(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { mWindow.dismiss(); return true; } return false; } }); 

mWindow – всплывающее окно

И если вы хотите иметь такую ​​же функциональность для Activity, вам нужно выполнить следующие шаги.

1) Добавить флаг перед setContentView() вызываемым в onCreate();

  getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL); // ...but notify us that it happened. getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); 

2) Переопределить onTouchEvent() в onTouchEvent()

И напишите ниже код

  @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { Toast.makeText(getApplicationContext(), "Finish", 3000).show(); finish(); return true; } return false; } 

Полная копия здесь

Мероприятия

 package net.londatiga.android; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.WindowManager.LayoutParams; import android.widget.Button; import android.widget.Toast; public class NewQuickAction3DActivity extends Activity implements OnTouchListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Make us non-modal, so that others can receive touch events. getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL); // ...but notify us that it happened. getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); setContentView(R.layout.main); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { Toast.makeText(getApplicationContext(), "Hi", 3000).show(); return true; } return false; } } 

Это manifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.londatiga.android" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".NewQuickAction3DActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Dialog"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ? <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.londatiga.android" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".NewQuickAction3DActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Dialog"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

Вы также можете использовать Activity # setFinishOnTouchOutside , если в вашем диалоговом окне есть Activity . Это должен быть самый короткий путь для Activity s;)

(Однако это API 11+, но API <= 10 обычно имеет размер экрана.)

Вы можете использовать

  dialog.setCancelable(true\false); 

Для последних версий Android;

Он отключит событие outSideTouching.

Просто я пишу dialog.setCanceledOnTouchOutside (false); И он работает для меня, окно не будет отключено на внешнем кране.

  dialog = new Dialog(MainActivity.this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.dialog_layout); dialog.getWindow().setBackgroundDrawableResource( android.R.color.transparent); dialog.setCancelable(false); dialog.setCanceledOnTouchOutside(true); 

Проверьте, есть ли у вас эта строка кода или нет.

  dialog.setCanceledOnTouchOutside(true); 

Старый вопрос, но еще одно решение:

  1. Сделайте полноэкранный режим переднего плана. Условные макеты: полноэкранный макет должен иметь прозрачный фон (например, @null или @android:color/transparent ). Внутренний макет должен иметь видимый фон.

  2. Добавьте OnClickListener в невидимый внешний макет, который finish() вашу активность.

Используйте стиль диалога, а не другие стили.

Например, использование

 public YourCustomDialog(Context context) { super(context, android.R.style.Theme_Holo_dialog_NoActionBar); } 

Когда вы используете другие стили, такие как Theme_Translucent_NoTitleBar , диалог не будет отклонен.

 LayoutParams lp=dialogp.getWindow().getAttributes(); lp.flags=LayoutParams.FLAG_LAYOUT_NO_LIMITS; 

Я добавил это, и он работает безупречно на 3.0, но должен работать на всех.

this.setFinishOnTouchOutside (ложь);

Вы можете использовать это

Любые представления в диалоговом окне могут устанавливать, чтобы потреблять событие касания, чтобы нижеследующее не вызывалось.

 onCreate(){ getWindow().getDecorView().getRootView().setOnTouchListener(new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { dialog.dismiss(); return false; } });