PopupWindow-отклонить при нажатии снаружи
У меня есть всплывающее окно на моей деятельности, дело в том, что мое всплывающее окно все еще показывает, даже когда я взаимодействую с моей деятельностью (скажем, прокрутка в моем списке). Я могу прокрутить свой список, и всплывающее окно все еще там.
чего я хочу добиться-это когда я прикасаюсь к/прокрутка/нажатие/и т. д. На экране, который не PopupWindow, я хочу уволить PopupWindow. Как меню работает. Если вы нажмете за пределами меню, меню будет отстраненный.
Я пробовал setOutsideTouchable(true) но он не закроет окно. Спасибо.
13 ответов:
пожалуйста, попробуйте установить
setBackgroundDrawableonPopupWindowэто должно закрыть окно, если вы касаетесь за его пределами.
я обнаружил, что ни один из предоставленных ответов не работал для меня, за исключением комментария Варениньи о принятом ответе, и, вероятно, также будет работать Марцин С. Вот часть, которая работает для меня:
myPopupWindow.setBackgroundDrawable(new BitmapDrawable()); myPopupWindow.setOutsideTouchable(true);кроме того:
myPopupWindow.setFocusable(true);Не уверен, в чем разница, но исходный код ListPopupWindow фактически использует последний, когда его модальность установлена в true с setModal, поэтому, по крайней мере, разработчики Android считают это жизнеспособным подходом, и это только один линия.
Я встретил те же проблемы, и исправил это, как показано ниже коды. Это прекрасно работает для меня.
// 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.Р. цвет.прозрачный) для замены фона по умолчанию.
удачи@.@
Я знаю, что уже поздно, но я замечаю, что у людей все еще есть проблема с всплывающим окном. Я решил написать полностью рабочий пример, где вы можете закрыть всплывающее окно, коснувшись или щелкнув за его пределами или просто коснувшись самого окна. Для этого создайте новый класс PopupWindow и скопируйте этот код:
PopupWindow.класс
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); } }Теперь создайте макет для всплывающего окна окно: всплывающее окно.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.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);
Спасибо за ответ @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 make prevent touch event to 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уволит его.
установите фон окна прозрачным:
PopupWindow.getBackground().setAlpha(0);после этого установите фон в макете. Работать отлично.
@LunaKong suggestion work - это как шарм.
но настройка mPopupWindow.setFocusable (false). удаляет ненужные прикосновения, необходимые для исчезновения всплывающего окна.
например: Давайте рассмотрим, что есть всплывающее окно, видимое на экране, и вы собираетесь нажать кнопку. Так что в этом случае (если mpopwindow.setFocusable (true)) при первом нажатии кнопки popupwindow будет уволен. Но вы должны нажать еще раз, чтобы сделать кнопка работает. если**(mpopwindwo.setFocusable (false)** одним нажатием кнопки закрыть всплывающее окно, а также вызвать нажатием кнопки. Надеюсь, это поможет.
popupWindow.setTouchable(true); popupWindow.setFocusable(true); popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);он будет отклонять всплывающее окно при нажатии / касании на экране.Убедитесь, что вы установили focusable true перед showAtLocation.
в некоторых случаях делать всплывающее окно фокусируемым нежелательно (например, вы не можете захотеть, чтобы он украл фокус из другого представления).
альтернативный подход заключается в использовании сенсорного перехватчика:
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; } });
используйте View popupView, чтобы закрыть popupWindow
`popupView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { popupWindow.dismiss(); } });` Если вы используете это вы также можете setOnClickListener к любой кнопке внутри popupWindow
Comments