2012-06-15 18 views
12

私はPopupWindowを使ってメニューを再生します.PopupWindowはEditTextと重なっています。PopupWindow z ordering

私のPopupWindowがEditText IMEシステム(選択マーク、貼り付けボタン)からのいくつかの項目によって重複している点を除いて、正常に動作します。

私のポップアップウインドウがその装飾の上に表示されるようにするにはどうすればいいですか?

ここに何が起こっているのかの画像です。私はPopupWindow(メニュー)をすべての上に描画する必要があるので、何とかWindowManagerにウィンドウの順序付けを指示します。おかげさまで 自分anwer見つかり

enter image description here

+0

良い質問。残念ながら、答えはあなたが本当にできないことになると思います。それを行う方法があるなら、私は在庫アンドロイドでしか動かないかもしれないと想像します。テキストセレクタとコンテキストポップアップは、メーカーが通常ハードウェアにカスタマイズバージョンを導入していることの一部です。それを行う方法があっても、EditTextに行ったカスタマイズのために、すべてのデバイスタイプで動作しないと思います。 – FoamyGuy

+0

カスタマイズは無関係です。技術的にはAndroidのレベルで何とか描画する必要があります。私はそれらがandroid.view.Windowのようなものだと思っています。android.view.WindowManagerを使用してください。 –

答えて

7

これらの装飾は通常のPopupWindow-sで、EditTextによって管理されます。

任意のウィンドウのZオーダーは、WindowManager.LayoutParams.typeで定義されていますが、実際にはウィンドウの目的を定義しています。有効な範囲は、ポップアップウィンドウの場合はFIRST_SUB_WINDOW - LAST_SUB_WINDOWです。

アプリケーションは通常、Javaリフレクションを使用して隠し関数PopupWindow.setWindowLayoutType(int)を呼び出し、希望のウィンドウタイプを設定する以外は、PopupWindowの "type"を変更できません。

結果:

enter image description here

はEDIT:それをし コード:

Method[] methods = PopupWindow.class.getMethods(); 
    for(Method m: methods){ 
    if(m.getName().equals("setWindowLayoutType")) { 
     try{ 
      m.invoke(getPopupWindow(), WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     break; 
    } 
    } 
+0

コードスニペットを入力してください。どうすればいいですか? – halxinate

2
public void compatibleSetWindowLayoutType(int layoutType) { 
    if (Build.VERSION.SDK_INT >= 23) { 
     setWindowLayoutType(layoutType); 
    } else { 
     try { 
      Class c = this.getClass(); 
      Method m = c.getMethod("setWindowLayoutType", Integer.TYPE); 
      if(m != null) { 
       m.invoke(this, layoutType); 
      } 
     } catch (Exception e) { 
     } 
    } 
} 
0
import android.support.v4.widget.PopupWindowCompat; 

PopupWindowCompat.setWindowLayoutType(popupWindow, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL);