web-dev-qa-db-ja.com

PopupWindow-外部をクリックすると閉じます

アクティビティにPopupWindowがあります。アクティビティと対話しているとき(リストをスクロールするときなど)でもPopupWindowが表示されたままです。リストをスクロールしても、PopupWindowはまだそこにあります。

私が達成したいのは、PopupWindowではない画面でタッチ/スクロール/クリックなどをしているときに、PopupWindowを閉じたいことです。メニューの仕組みと同じです。メニューの外側をクリックした場合、メニューは閉じられます。

setOutsideTouchable(true)を試しましたが、ウィンドウは閉じられません。ありがとう。

80
reika

setBackgroundDrawablePopupWindowに設定してみてください。ウィンドウの外側をタッチするとウィンドウが閉じます。

123
Marcin S.

受け入れられた回答に対するWareNinjaのコメントを除いて、提供された回答はどれも役に立たなかったことがわかりました。MarcinS.もおそらく機能します。ここに私のために働く部分があります:

myPopupWindow.setBackgroundDrawable(new BitmapDrawable());
myPopupWindow.setOutsideTouchable(true);

代わりに:

myPopupWindow.setFocusable(true);

違いはわかりませんが、ListPopupWindowのソースコードは、実際にモダリティがsetModalでtrueに設定されている場合、後者を使用するため、少なくともAndroid開発者はこれを実行可能なアプローチと見なし、1行のみです。

117
mpellegr

同じ問題に出会い、以下のコードで修正しました。それは私のためにうまく機能します。

    // Closes the popup window when touch outside.
    mPopupWindow.setOutsideTouchable(true);
    mPopupWindow.setFocusable(true);
    // Removes default background.
    mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

ところで、非推奨のBitmapDrawableコンストラクタを使用しないで、これを使用してくださいnew ColorDrawable(Android.R.color.transparent)デフォルトの背景。

楽しんで@。@

51
Luna Kong

私はそれが遅いことを知っていますが、私は人々がまだポップアップウィンドウに問題があることに気づきます。ポップアップウィンドウの外側をタッチまたはクリックするか、ウィンドウ自体をタッチするだけでポップアップウィンドウを閉じることができる完全に機能する例を作成することにしました。これを行うには、新しい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がポップアップする現在のアクティビティのレイアウトです

21
Marcin S.

@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。

12
Nguyen Tan Dat

ListPopupWindowの場合、表示時にウィンドウをモーダルに設定します。

mListPopupWindow.setModal(true);

そうすれば、ListPopupWindowの外側をクリックすると、それが消えます。

6
toobsco42

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);
6
Hadi Note

ウィンドウの背景を透明に設定します。

PopupWindow.getBackground().setAlpha(0);

レイアウトで背景を設定した後。正常に動作します。

3
amak
mPopWindow.setFocusable(true);
3

@LunaKongの提案作業は魅力のようなものです。

ただし、mPopupWindow.setFocusable(false)。を設定すると、ポップアップウィンドウを非表示にするために必要な不要なタッチが削除されます。

例:画面にポップアップウィンドウが表示されており、ボタンをクリックしようとしているとします。そのため、この場合、(mpopwindow.setFocusable(true)の場合)ボタンを最初にクリックすると、popupwindowは閉じられます。ただし、ボタンを機能させるには、もう一度クリックする必要があります。 if **(mpopwindwo.setFocusable(false)**ボタンのシングルクリックポップアップウィンドウを閉じ、ボタンのクリックをトリガーします。役に立てば幸いです。

2
HourGlass
  popupWindow.setTouchable(true);
  popupWindow.setFocusable(true);
  popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);

画面でクリック/タッチするとPopupWindowを閉じます。showAtLocationの前にfocusableをtrueに設定してください。

2
android

場合によっては、ポップアップをフォーカス可能にすることは望ましくありません(たとえば、別のビューからフォーカスを奪いたくない場合があります)。

別のアプローチは、タッチインターセプターを使用することです。

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;
    }
});
1
dev.bmax

isOutsideTouchableまたはisFocusableを使用して、外部に触れたときにポップアップウィンドウを閉じることができます

popupWindow.isOutsideTouchable = true // dismiss popupwindow when touch outside

popupWindow.isFocusable = true // dismiss popupwindow when touch outside AND when press back button

  • 現在、テスト後、setBackgroundDrawabledo n'tと表示され、popupwindowを閉じるのに役立ちます

  • PopupWindowPopupWindow->PopupDecorView->dispatchKeyEventおよびPopupWindow->PopupDecorView->onTouchEvent)で却下のコードを見ると。戻るボタンを押すと、ACTION_UPで却下され、外側をタッチすると、ACTION_UPまたはACTION_OUTSIDEで却下されることがわかります。

0
Phan Van Linh

PopupViewを表示してpopupWindowを閉じる

`popupView.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View view) {
                       popupWindow.dismiss();
                   }
               }); 

`これを使用する場合、popupWindow内の任意のボタンにsetOnClickListenerを設定することもできます

0