У меня есть PopupWindow для моей активности, дело в том, что мое PopupWindow все еще отображается, даже когда я взаимодействую со своей деятельностью (например, прокручиваю свой список). Я могу пролистать свой список, а PopupWindow все еще там.
Я хочу добиться, чтобы когда я касался / прокручиваю / щелкаю / и т. Д. На экране, который не является PopupWindow, я хочу отклонить PopupWindow. Так же, как работает меню. Если вы щелкнули вне меню, меню будет закрыто.
Я пробовал, setOutsideTouchable(true)
но окно не закрывается. Спасибо.
android
popupwindow
android-menu
крестьянин
источник
источник
BitmapDrawable()
не работает.ColorDrawable()
Вместо этого используйте .Я обнаружил, что ни один из предоставленных ответов не работал для меня, за исключением комментария WareNinja к принятому ответу, и, вероятно, также сработает Марцин С. Вот что мне подходит:
myPopupWindow.setBackgroundDrawable(new BitmapDrawable()); myPopupWindow.setOutsideTouchable(true);
Альтернативно:
myPopupWindow.setFocusable(true);
Не уверен, в чем разница, но исходный код ListPopupWindow фактически использует последний, когда для его модальности установлено значение true с помощью setModal, поэтому, по крайней мере, разработчики Android считают этот подход жизнеспособным, и это всего лишь одна строка.
источник
setFocusable
нам нужно дважды щелкнуть кнопку (где кнопка находится за пределами всплывающего окна), где, как и в первом методе, он работает нормально :)BitmapDrawable()
деприминирован.ColorDrawable()
Вместо этого используйте .Я столкнулся с теми же проблемами и исправил их, как показано ниже. Он отлично работает для меня.
// Closes the popup window when touch outside. mPopupWindow.setOutsideTouchable(true); mPopupWindow.setFocusable(true); // Removes default background. mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Кстати, не используйте устаревший конструктор BitmapDrawable, используйте этот новый ColorDrawable (android.R.color.transparent) для замены фона по умолчанию.
Радоваться, веселиться@.@
источник
Я знаю, что уже поздно, но замечаю, что у людей все еще проблема со всплывающим окном. Я решил написать полностью рабочий пример, в котором вы можете закрыть всплывающее окно, коснувшись или щелкнув за его пределами, или просто коснувшись самого окна. Для этого создайте новый класс PopupWindow и скопируйте этот код:
PopupWindow.class
public class PopupWindow extends android.widget.PopupWindow { Context ctx; Button btnDismiss; TextView lblText; View popupView; public PopupWindow(Context context) { super(context); ctx = context; popupView = LayoutInflater.from(context).inflate(R.layout.popup, null); setContentView(popupView); btnDismiss = (Button)popupView.findViewById(R.id.btn_dismiss); lblText = (TextView)popupView.findViewById(R.id.text); setHeight(WindowManager.LayoutParams.WRAP_CONTENT); setWidth(WindowManager.LayoutParams.WRAP_CONTENT); // Closes the popup window when touch outside of it - when looses focus setOutsideTouchable(true); setFocusable(true); // Removes default black background setBackgroundDrawable(new BitmapDrawable()); btnDismiss.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { dismiss(); }}); // Closes the popup window when touch it /* this.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE) { dismiss(); } return true; } }); */ } // End constructor // Attaches the view to its parent anchor-view at position x and y public void show(View anchor, int x, int y) { showAtLocation(anchor, Gravity.CENTER, x, y); } }
Теперь создайте макет для всплывающего окна: popup.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="1dp" android:orientation="vertical" android:padding="10dp" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="5dp" android:text="PopupWindow Example" android:textColor="#000000" android:textSize="17sp" android:textStyle="italic" /> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical"> <Button android:id="@+id/btn_dismiss" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Dismiss" android:visibility="gone" /> <TextView android:id="@+id/lbl_dismiss" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Touch outside of this box to dismiss" android:textColor="#ffffff" android:textStyle="bold" /> </FrameLayout>
В своей основной деятельности создайте экземпляр класса PopupWindow:
final PopupWindow popupWindow = new PopupWindow(this); popupWindow.show(findViewById(R.id.YOUR_MAIN_LAYOUT), 0, -250);
где YOUR_MAIN_LAYOUT - это макет текущего действия, в котором всплывает popupWindow
источник
Спасибо за ответ @ LunaKong и подтверждение @ HourGlass. Я не хочу дублировать комментарий, а хочу лишь сделать его ясным и кратким.
// Closes the popup window when touch outside. This method was written informatively in Google's docs. mPopupWindow.setOutsideTouchable(true); // Set focus true to prevent a touch event to go to a below view (main layout), which works like a dialog with 'cancel' property => Try it! And you will know what I mean. mPopupWindow.setFocusable(true); // Removes default background. mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
Mttdat.
источник
Для
ListPopupWindow
установки окно будет модальным при отображении.mListPopupWindow.setModal(true);
Таким образом, щелчок за пределами
ListPopupWindow
закроет его.источник
mListPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
, чтобы всплывающее окно не мешало работе экранной клавиатуры.Обратите внимание, что для отмены с помощью
popupWindow.setOutsideTouchable(true)
вам необходимо указать ширину и высоту,wrap_content
как показано в приведенном ниже коде:PopupWindow popupWindow = new PopupWindow( G.layoutInflater.inflate(R.layout.lay_dialog_support, null, false), WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, true); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); popupWindow.showAtLocation(view, Gravity.RIGHT, 0, 0);
источник
popupWindow.setTouchable(true); popupWindow.setFocusable(true); popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
Он закроет PopupWindow при нажатии / касании на экране. Убедитесь, что вы установили focusable true перед showAtLocation.
источник
Вы можете использовать
isOutsideTouchable
ИЛИ,isFocusable
чтобы закрыть всплывающее окно при касании снаружиpopupWindow.isOutsideTouchable = true // dismiss popupwindow when touch outside popupWindow.isFocusable = true // dismiss popupwindow when touch outside AND when press back button
Заметка
В настоящее время после теста я вижу,
setBackgroundDrawable
что не помогает нам закрыть всплывающее окноЕсли вы посмотрите код для увольнения в
PopupWindow
(PopupWindow->PopupDecorView->dispatchKeyEvent
иPopupWindow->PopupDecorView->onTouchEvent
). Вы увидите, что при нажатии кнопки возврата они закрываются,ACTION_UP
а при касании снаружи они закрываются наACTION_UP
илиACTION_OUTSIDE
источник
mPopWindow.setFocusable(true);
источник
Предложение @LunaKong работает как шарм.
Но настройка mPopupWindow.setFocusable (false). удаляет ненужные прикосновения, необходимые для исчезновения всплывающего окна.
Например: Предположим, на экране появляется всплывающее окно, и вы собираетесь нажать кнопку. Итак, в этом случае (если mpopwindow.setFocusable (true)) при первом нажатии кнопки всплывающее окно закрывается. Но вам нужно щелкнуть еще раз, чтобы кнопка заработала. if ** (mpopwindwo.setFocusable (false) ** однократное нажатие кнопки закрывает всплывающее окно, а также запускает нажатие кнопки. Надеюсь, это поможет.
источник
Установите прозрачный фон окна:
PopupWindow.getBackground().setAlpha(0);
После этого установите фон в макете. Работает отлично.
источник
В некоторых случаях делать всплывающее окно фокусируемым нежелательно (например, вы можете не захотеть, чтобы оно отвлекало фокус от другого представления).
Альтернативный подход - использование перехватчика касаний:
popupWindow.setOutsideTouchable(true); popupWindow.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { popupWindow.dismiss(); } return false; } });
источник
Если это всплывающее окно является другим действием, и вы уменьшили его размер до исходного экрана и хотите включить или отключить внешнюю область, вы можете просто включить или отключить внешнюю область с помощью этого кода:
включить:
YourActivity.this.setFinishOnTouchOutside(true);
отключить:
YourActivity.this.setFinishOnTouchOutside(false);
источник
Используйте View popupView, чтобы закрыть popupWindow
`popupView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { popupWindow.dismiss(); } });
`Если вы используете это, вы также можете установитьOnClickListener на любую кнопку внутри popupWindow
источник