3

このコードの作品は、アンドロイドのapi 16-22で動作するようですが、api 23では動作しません。単にオプション付きのpopupwindowを表示しようとしていますその中とpopupwindow以下の背景を暗く:

   WindowPopUp windowPopUp = 
         new WindowPopUp(mContext, mPlaces.get(position), position, fromSearch); 
       windowPopUp.showAtLocation(v, Gravity.CENTER, 0, 0); 
       View parent = (View) windowPopUp.getContentView().getParent(); 
       //dim the window in the background 
       WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
       WindowManager.LayoutParams p = (WindowManager.LayoutParams) parent.getLayoutParams(); 
       p.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND; 
       p.dimAmount = 0.4f; 
       wm.updateViewLayout(parent, p); 

エラーでこのコードの結果を実行:

   03-18 21:55:19.674 8814-8814/? E/AndroidRuntime: FATAL EXCEPTION: main 
              Process: com.myapp, PID: 8814 
              java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.view.WindowManager$LayoutParams 
               at com.bemyapp.adapter.OuterPlaceAdapter$5.onLongClick(OuterPlaceAdapter.java:400) 
               at android.view.View.performLongClick(View.java:5237) 
               at android.view.View$CheckForLongPress.run(View.java:21121) 
               at android.os.Handler.handleCallback(Handler.java:739) 
               at android.os.Handler.dispatchMessage(Handler.java:95) 
               at android.os.Looper.loop(Looper.java:148) 
               at android.app.ActivityThread.main(ActivityThread.java:5417) 
               at java.lang.reflect.Method.invoke(Native Method) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

間違っていますか?

私の知る限りでは、WindowManager.LayoutParamsViewGroup.LayoutParamsを拡張し、私はparent.getLayoutParams()を呼び出すとき、それはViewGroup.LayoutParamsを返しますので、classCastExceptionがあってはなりません。

答えて

1

クラスキャストの例外があります。 ViewGroup.LayoutParamsWindowManager.LayoutParamsにキャストしようとしています。返される実際のオブジェクトがViewGroup.LayoutParams(たとえば、FrameLayout.LayoutParams)の異なる子のインスタンスである場合、キャストは不正です。この場合、parentというビューはウィンドウ内に直接存在しません。その内部はFrameLayoutです。したがって、getLayoutParamsを呼び出すとWindowsManager.LayoutParamsではなくFrameLayout.LayoutParamsが返されます。

23で作業していて、23ではなく23で作業している場合、ポップアップが23でどのように行われたかがかなり変わっている可能性があります。ウィンドウの内部にある親のポップアップに依存することは決して安全な前提ではなく、 OSアップデートによって壊れてしまう

+0

しかし、なぜapi 16-22では動作しますが、api 23では動作しませんか? – Simon

+0

編集を追加しました。基本的には、変更された実装の詳細に依存していました。 –

+0

これはひどいニュースです。私はすべてのポップアップウィンドウをDialogActivityに変更しなければならないと思う。 Popupwindowsは、これが正しい場合、良い設計アイデアではありません。 – Simon

9

コンテナにアクセスするためにもう1つの.getParent()を追加するだけです。

if (android.os.Build.VERSION.SDK_INT > 22) { 
      container = (View) pwindow.getContentView().getParent().getParent(); 
     }else{ 
      container = (View) pwindow.getContentView().getParent(); 
     } 
関連する問題