2011-09-01 3 views
6

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); 
    } 
} 
+2

この方法を試しましたか? http://developer.android。com/reference/android/widget/PopupWindow.html#setOutsideTouchable%28 boolean%29 – ernazm

+0

@ernazmこれを答えにする必要があります。 – Phil

+0

私はそれを使用していないので、このメソッドは意図したとおりに動作しているのか分かりません(アンドロイドSDKにはたくさんのバグがあります)。 – ernazm

答えて

8

のjavadocを1として制御します。これは何もしないための方法 setOutsideTouchable()を引き起こし

だからあなたのライン

window.setFocusable(true); 
触れることができるが、

フォーカス可能ではないポップアップのために理にかなっています。ちょうどernazmよう

+0

window.setFocusable(false)であっても。これはデフォルトで閉じます –

1

カスタムポップアップウィンドウを作らなければなりません。そこでは別のレイアウトを呼び出す必要があります。このようにして、他のコンポーネントにもアクセスできます。 レイアウトの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を追加する必要があります、それはrunnningまで私はしていません。 –

+1

次に、ポップアップウィンドウのカスタムスタイルを実装し、必要に応じてプロパティを設定する必要があります。 –

12

は、ポップアップが窓の外にタッチイベントが通知されますか

のjavadocあたりなどのコントロールと言います。これは、 触れることができるが、

フォーカス可能ではないポップアップのために理にかなっているとあれば、それは、ウィンドウtouchalbeがtrueの場合、フォーカス可能で、setOutsideTouchable()は仕事偽です

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

の仕事ですsetOutsideTouchable(true)、popupwindowの外側にあるtouchは閉じます。そうしないと、popupwindowの外側も閉じずにタッチできます。あなたのコードにこれを追加すること

+1

'setTouchable()'はデフォルトで 'true'です。 'setOutsideTouchable()'はデフォルトで 'false'です。したがって、本当に設定する必要があるのは 'setFocusable(false)'です。しかし、イベントリスナーは、ポップアップ内のビューではフォーカスできない場合は機能しません。 –

+0

これはちょっと面倒です。ドキュメントは正しかったですが、なんらかの理由で、私はいつも真実に焦点を合わせたいと思っています。上記の3つの設定作業。 –

+0

私のスピナーのイベントリスナーは機能しますが、私のedittextリスナーは動作しません。 –

0

試してみてください。

window.setOutsideTouchable(true); 

Android documentationから:

void setOutsideTouchable (boolean touchable) 

ポップアップが窓の外にタッチイベントが通知されますかどうかを制御します。これは、タッチ可能であるがフォーカス可能ではないポップアップに対してのみ意味を持ちます。つまり、ウィンドウの外に触れるということは、後ろのウィンドウに配信されることを意味します。デフォルトはfalseです。

ポップアップが表示されている場合、このメソッドの呼び出しは、次回ポップアップが表示されたとき、またはupdate()メソッドの1つを手動で呼び出して有効になります。

関連する問題