打开一个弹出窗口,让外人仍然可以触摸

时间:2011-09-01 14:26:34

标签: android popupwindow

如何在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);
    }
}

4 个答案:

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

来自Android documentation

void setOutsideTouchable (boolean touchable)
     

控制是否将弹出窗口外的触摸事件通知弹出窗口。这仅适用于可触摸但不可聚焦的弹出窗口,这意味着窗口外的触摸将被传递到窗口后面。默认值为false

     

如果显示弹出窗口,则调用此方法仅在下次显示弹出窗口时或通过手动调用其中一个update()方法时生效。