2011-09-01 66 views
6

如何打開Android上的PopupWindow並讓所有其他組件觸摸而不關閉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); 
    } 
} 
+2

您是否試過這種方法? http://developer.android。com/reference/android/widget/PopupWindow.html#setOutsideTouchable%28boolean%@ – ernazm

+0

@ernazm,您應該將其移至答案。 – Phil

+0

嗯,我不確定這種方法是否按預期工作,因爲我沒有使用它(android SDK有很多bug的東西tbh),這個問題已經提出。 – ernazm

回答

8

按的javadoc

控制是否彈出將觸摸事件的窗口之外的通知。這僅是有道理的彈出式視窗,可觸摸,但不可作爲焦點

所以你行

window.setFocusable(true); 

導致方法setOutsideTouchable()什麼也不做。

+0

即使使用window.setFocusable(false);這默認關閉 –

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> 

試試這個。您可以隨時隱藏和顯示佈局。其他領域是可訪問的。

+0

我真的需要在運行時添加PopupWindows,我沒有,直到它正在運行。 –

+1

然後,您應該必須實現彈出窗口的自定義樣式並根據需要設置屬性。 –

12

就像ernazm說

按的javadoc

控制是否彈出將觸摸事件的窗口之外的通知。這僅是有道理的彈出式視窗,可觸摸,但不可作爲焦點

,它是在

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

工作當窗口touchalbe是真實的,可聚焦的是假的,setOutsideTouchable()是工作,如果setOutsideTouchable(true),在popupwindow之外的觸摸將被解除,否則popupwindows的外部仍然可以被觸摸而不被忽略。

+1

'setTouchable()'默認爲'true'。和'setOutsideTouchable()'默認爲'false'。所以你真正需要設置的是'setFocusable(false)'。但是,如果事件偵聽器不可聚焦時,事件偵聽器不會在彈出窗口內工作。 –

+0

這有點棘手。該文件是正確的,但由於某種原因,我總是希望將焦點設置爲真實。以上三項設置工作。 –

+0

我的spinners的事件監聽器工作,但我的edittext監聽器沒有。 –

0

嘗試增加給你的代碼:

window.setOutsideTouchable(true); 

Android documentation

void setOutsideTouchable (boolean touchable) 

控制是否彈出將觸摸事件的窗口之外的通知。這隻對可觸摸但不可聚焦的彈出窗口有意義,這意味着在窗口外面的觸摸將被傳送到後面的窗口。默認值是false

如果顯示彈出窗口,調用此方法將僅在下次顯示彈出窗口或通過手動調用update()方法之一時生效。

相關問題