如何在Android上打开PopupWindow并让所有其他组件都可以触摸而不会忽略PopupWindow?
这就是它的创建方式:
public class DynamicPopup {
private final PopupWindow window;
private final RectF rect;
private final View parent;
private final RichPageView view;
public DynamicPopup(Context context, RichPage page, RectF rectF, View parent) {
this.parent = parent;
rect = rectF;
window = new PopupWindow(context);
window.setBackgroundDrawable(new BitmapDrawable());
window.setWidth((int) rect.width());
window.setHeight((int) rect.height());
window.setTouchable(true);
window.setFocusable(true);
window.setOutsideTouchable(true);
view = new RichPageView(context, page, false);
window.setContentView(view);
view.setOnCloseListener(new Listener(){
@Override
public void onAction() {
window.dismiss();
}
});
}
public void show() {
window.showAtLocation(parent, Gravity.NO_GRAVITY, (int) rect.left, (int) rect.top);
}
}
答案 0 :(得分:12)
就像ernazm说的那样
根据javadocs
控制是否将弹出窗口外的触摸事件通知弹出窗口。这仅适用于可触摸但无法调焦
的弹出式窗口
,它的工作在
window.setTouchable(true);
window.setFocusable(false);
window.setOutsideTouchable(false);
当window touchalbe为true时,focusable为false,setOutsideTouchable()正常工作,如果setOutsideTouchable(true),则popupwindow外部的触摸将被忽略,否则popupwindows的外部仍然可以在不解散的情况下触摸。
答案 1 :(得分:8)
根据javadocs
控制是否将弹出窗口外的触摸事件通知弹出窗口。这仅适用于可触摸但无法调焦
的弹出式窗口
所以你的行
window.setFocusable(true);
导致方法setOutsideTouchable()
什么都不做。
答案 2 :(得分:1)
为此,您必须创建自定义弹出窗口。在那你必须调用另一个布局。所以这样你也可以访问其他组件。 它只是布局的一种类型。但您可以将其外观设置为弹出窗口。
<!-- POPUP MENU -->
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/popup_window"
android:orientation="vertical"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/fullwindowborderforpopup"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="1px"
android:layout_marginTop="15dip"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:layout_marginBottom="10dip"
android:background="@drawable/borderforpopup"
>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="5dip"
android:layout_marginLeft="3dip"
android:layout_marginRight="3dip"
android:layout_marginBottom="3dip">
<TextView
android:id="@+id/tital_of_popup"
android:gravity="center_vertical|center_horizontal"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Event Registration"
android:textStyle="bold"
android:textColor="#ffffff"
/>
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="5dip"
android:layout_marginLeft="3dip"
android:layout_marginRight="3dip"
android:layout_marginBottom="3dip"
>
<TextView
android:id="@+id/message_of_popup"
android:gravity="center_vertical|center_horizontal"
android:layout_height="wrap_content"
android:text="Please fill all the data"
android:layout_width="wrap_content"
android:textStyle="normal"
android:textColor="#ffffff" />
</LinearLayout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_marginTop="5dip"
android:layout_marginLeft="6dip"
android:layout_marginRight="6dip"
android:layout_marginBottom="9dip"
>
<Button
android:layout_height="fill_parent"
android:id="@+id/okbutton"
android:text="OK"
android:textColor="#ffffff"
android:shadowColor="#000000"
android:gravity="center"
android:layout_width="fill_parent"
android:background="@drawable/buttonborderframe"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
试试这个。您可以随时隐藏和显示布局。其他领域是可访问的。
答案 3 :(得分:0)
尝试将此添加到您的代码中:
window.setOutsideTouchable(true);
void setOutsideTouchable (boolean touchable)
控制是否将弹出窗口外的触摸事件通知弹出窗口。这仅适用于可触摸但不可聚焦的弹出窗口,这意味着窗口外的触摸将被传递到窗口后面。默认值为
false
。如果显示弹出窗口,则调用此方法仅在下次显示弹出窗口时或通过手动调用其中一个
update()
方法时生效。