アクティビティにPopupWindowがあります。アクティビティと対話しているとき(リストをスクロールするときなど)でもPopupWindowが表示されたままです。リストをスクロールしても、PopupWindowはまだそこにあります。
私が達成したいのは、PopupWindowではない画面でタッチ/スクロール/クリックなどをしているときに、PopupWindowを閉じたいことです。メニューの仕組みと同じです。メニューの外側をクリックした場合、メニューは閉じられます。
setOutsideTouchable(true)
を試しましたが、ウィンドウは閉じられません。ありがとう。
setBackgroundDrawable
をPopupWindow
に設定してみてください。ウィンドウの外側をタッチするとウィンドウが閉じます。
受け入れられた回答に対するWareNinjaのコメントを除いて、提供された回答はどれも役に立たなかったことがわかりました。MarcinS.もおそらく機能します。ここに私のために働く部分があります:
myPopupWindow.setBackgroundDrawable(new BitmapDrawable());
myPopupWindow.setOutsideTouchable(true);
代わりに:
myPopupWindow.setFocusable(true);
違いはわかりませんが、ListPopupWindowのソースコードは、実際にモダリティがsetModalでtrueに設定されている場合、後者を使用するため、少なくともAndroid開発者はこれを実行可能なアプローチと見なし、1行のみです。
同じ問題に出会い、以下のコードで修正しました。それは私のためにうまく機能します。
// 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)デフォルトの背景。
楽しんで@。@
私はそれが遅いことを知っていますが、私は人々がまだポップアップウィンドウに問題があることに気づきます。ポップアップウィンドウの外側をタッチまたはクリックするか、ウィンドウ自体をタッチするだけでポップアップウィンドウを閉じることができる完全に機能する例を作成することにしました。これを行うには、新しい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
の外側をクリックすると、それが消えます。
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.getBackground().setAlpha(0);
レイアウトで背景を設定した後。正常に動作します。
mPopWindow.setFocusable(true);
@LunaKongの提案作業は魅力のようなものです。
ただし、mPopupWindow.setFocusable(false)。を設定すると、ポップアップウィンドウを非表示にするために必要な不要なタッチが削除されます。
例:画面にポップアップウィンドウが表示されており、ボタンをクリックしようとしているとします。そのため、この場合、(mpopwindow.setFocusable(true)の場合)ボタンを最初にクリックすると、popupwindowは閉じられます。ただし、ボタンを機能させるには、もう一度クリックする必要があります。 if **(mpopwindwo.setFocusable(false)**ボタンのシングルクリックポップアップウィンドウを閉じ、ボタンのクリックをトリガーします。役に立てば幸いです。
popupWindow.setTouchable(true);
popupWindow.setFocusable(true);
popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
画面でクリック/タッチするとPopupWindowを閉じます。showAtLocationの前にfocusableをtrueに設定してください。
場合によっては、ポップアップをフォーカス可能にすることは望ましくありません(たとえば、別のビューからフォーカスを奪いたくない場合があります)。
別のアプローチは、タッチインターセプターを使用することです。
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;
}
});
isOutsideTouchable
またはisFocusable
を使用して、外部に触れたときにポップアップウィンドウを閉じることができます
popupWindow.isOutsideTouchable = true // dismiss popupwindow when touch outside
popupWindow.isFocusable = true // dismiss popupwindow when touch outside AND when press back button
注
現在、テスト後、setBackgroundDrawable
do n'tと表示され、popupwindowを閉じるのに役立ちます
PopupWindow
(PopupWindow->PopupDecorView->dispatchKeyEvent
およびPopupWindow->PopupDecorView->onTouchEvent
)で却下のコードを見ると。戻るボタンを押すと、ACTION_UP
で却下され、外側をタッチすると、ACTION_UP
またはACTION_OUTSIDE
で却下されることがわかります。
PopupViewを表示してpopupWindowを閉じる
`popupView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
popupWindow.dismiss();
}
});
`これを使用する場合、popupWindow内の任意のボタンにsetOnClickListenerを設定することもできます