PopupWindow-отклонить при нажатии снаружи



У меня есть всплывающее окно на моей деятельности, дело в том, что мое всплывающее окно все еще показывает, даже когда я взаимодействую с моей деятельностью (скажем, прокрутка в моем списке). Я могу прокрутить свой список, и всплывающее окно все еще там.



чего я хочу добиться-это когда я прикасаюсь к/прокрутка/нажатие/и т. д. На экране, который не PopupWindow, я хочу уволить PopupWindow. Как меню работает. Если вы нажмете за пределами меню, меню будет отстраненный.



Я пробовал setOutsideTouchable(true) но он не закроет окно. Спасибо.

575   13  

13 ответов:

пожалуйста, попробуйте установить setBackgroundDrawable on PopupWindow это должно закрыть окно, если вы касаетесь за его пределами.

я обнаружил, что ни один из предоставленных ответов не работал для меня, за исключением комментария Варениньи о принятом ответе, и, вероятно, также будет работать Марцин С. Вот часть, которая работает для меня:

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);

после этого установите фон в макете. Работать отлично.

mPopWindow.setFocusable(true);

@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

    Ничего не найдено.