Откройте PopupWindow и позвольте внешним сторонам по-прежнему касаться

Как открыть PopupWindow на Android и разрешить касание всех остальных компонентов, не закрывая 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);
    }
}

person Marcos Vasconcelos    schedule 01.09.2011    source источник
comment
Вы пробовали этот метод? developer.android.com/reference/android/widget/   -  person ernazm    schedule 01.09.2011
comment
@ernazm, ты должен переместить это в ответ.   -  person Phil    schedule 01.09.2011
comment
Ну, я не уверен, что этот метод работает по назначению, так как я его не использовал (Android SDK имеет много ошибок), и этот вопрос был поднят.   -  person ernazm    schedule 01.09.2011
comment
Я добавил код, который уже использовал, setOutsideTouchable(true) тоже не работает.   -  person Marcos Vasconcelos    schedule 01.09.2011


Ответы (4)


Согласно javadocs

Определяет, будет ли всплывающее окно информироваться о сенсорных событиях за пределами его окна. Это имеет смысл только для всплывающих окон, которые можно нажимать, но нельзя сфокусировать.

Итак, ваша линия

 window.setFocusable(true);

заставляет метод setOutsideTouchable() ничего не делать.

person ernazm    schedule 01.09.2011
comment
Даже с window.setFocusable(false); это закрывается по умолчанию - person Marcos Vasconcelos; 01.09.2011

так же, как говорят ernazm

Согласно javadocs

Определяет, будет ли всплывающее окно информироваться о сенсорных событиях за пределами его окна. Это имеет смысл только для всплывающих окон, которые можно нажимать, но нельзя сфокусировать.

и это работа над

window.setTouchable(true);
window.setFocusable(false);
window.setOutsideTouchable(false);

Когда для окна touchalbe установлено значение true, для focusable установлено значение false, setOutsideTouchable() работает, если setOutsideTouchable(true), касание за пределами popupwindow будет отклонено, в противном случае за пределами popupwindows по-прежнему можно трогать без отклонения.

person Jay Parker    schedule 18.06.2012
comment
setTouchable() по умолчанию true. и setOutsideTouchable() по умолчанию false. Так что все, что вам действительно нужно установить, это setFocusable(false). Но кажется, что прослушиватели событий не работают с представлениями внутри всплывающего окна, когда оно не фокусируется. - person Nicolas Tyler; 03.10.2013
comment
Это немного сложно. Документы правильные, но по какой-то причине я всегда хочу установить для фокуса значение true. Вышеупомянутые три настройки работают. - person Todd Painton; 09.11.2013
comment
мой прослушиватель событий для счетчиков работает, а мой прослушиватель edittext - нет. - person tony gil; 09.11.2016

Для этого вы должны сделать Custom Popup окно. В этом вам нужно вызвать другой макет. Таким образом, вы также можете получить доступ к другому компоненту. Это всего лишь один тип раскладки. Но вы можете настроить его внешний вид как всплывающее окно.

<!-- 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>

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

person Shreyash Mahajan    schedule 01.09.2011
comment
Мне действительно нужно добавить PopupWindows во время выполнения, у меня его нет, пока он не запустится. - person Marcos Vasconcelos; 01.09.2011
comment
Затем вам нужно будет реализовать собственный стиль для всплывающего окна и установить свойство по своему усмотрению. - person Shreyash Mahajan; 02.09.2011

Попробуйте добавить это в свой код:

window.setOutsideTouchable(true);

Из документации Android:

void setOutsideTouchable (boolean touchable)

Определяет, будет ли всплывающее окно информироваться о сенсорных событиях за пределами его окна. Это имеет смысл только для всплывающих окон, к которым можно прикасаться, но нельзя сфокусировать, что означает, что касания за пределами окна будут доставлены в окно позади. По умолчанию false.

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

person Mohamed    schedule 08.06.2017