###前提・実現したいこと
オーバーレイのviewをServiceから起動するとてもシンプルなプログラムを作りたい。
言語はkotlinで作っています。オブジェクト指向型の勉強を始めたばかりなので、とても単純なことしか理解できていないが故の質問かと思います。
windowManager.addView(view, params)とwindowManager.removeView(view)の実装をどのようにすればいいのかがわかりません。
windowManagerのインスタンス化はonCreate()で行っているので、onDestroy()に書いたwindowManagerはスコープの関係で実行できない。なので、メソッドの外で一度nullのwindowManagerを定義すればいいと考え、以下のコードを書きました。
ですが、onCreate()内のwindowManager.addView(view, params)とonDestroy()内のwindowManager.removeView(view)にエラーが出てしまっています。
どのように書けばよいでしょうか?
###発生している問題・エラーメッセージ
(windowManager.addView(view, params)部分)
Smart cast to 'WindowManager' is impossible, because 'windowManager' is a mutable property that could have been changed by this time.
(onDestroy()内のwindowManager.removeView(view)部分)
Only are allowed on a nullable receiver of type WindowManager?
###Serviceのソースコード(kotlin)
kotlin
1class OverlayService : Service() { 2 3 private var windowManager: WindowManager? = null 4 private var view: View? = null 5 6 override fun onCreate() { 7 super.onCreate() 8 Log.d("hoge", "onCreate") 9 10 windowManager = getSystemService(Service.WINDOW_SERVICE) as WindowManager 11 val layoutinflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater 12 view = layoutinflater.inflate(R.layout.overlay_service, null) 13 14 val params = WindowManager.LayoutParams( 15 WindowManager.LayoutParams.WRAP_CONTENT, 16 WindowManager.LayoutParams.WRAP_CONTENT, 17 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 18 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or 19 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or 20 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or 21 WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 22 PixelFormat.TRANSLUCENT) 23 24 //viewを開く 25 windowManager.addView(view, params) 26 27 } 28 29 override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 30 Log.d("hoge", "onStartCommand") 31 32 return START_STICKY 33 } 34 35 override fun onDestroy() { 36 super.onDestroy() 37 Log.d("hoge", "onDestroy") 38 //viweを閉じる 39 windowManager.removeView(view) 40 41 } 42 43 //バインドしないからnull 44 override fun onBind(intent: Intent): IBinder? { 45 return null 46 } 47}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/14 00:56