Surface Duo スクリーン マネージャー

注意事項

このコンポーネントは非推奨とされており、現在はサポートされていません。

表示領域と折りたたみ機能に関する情報を取得するには、Jetpack Window Manager を使用する必要があります。

または、デュアルスクリーンおよび折りたたみ型デバイスに自動的に適応できる、これらのデュアルスクリーン コントロールとレイアウトのいずれかを使用します。

SurfaceDuoScreenManager は、2 つの異なる画面マネージャーの実装 (片方は Microsoft DisplayMask ライブラリを使用し、他方は Google WindowManager ライブラリを使用) のための共通プロトコルです。 このインターフェイスにより、画面情報リスナーの登録と登録解除を実行するために使用するメソッドが定義されます。

画面マネージャーを作成するには、SurfaceDuoScreenManager の実装のシングルトン インスタンスが返される ScreenManagerProvider.getScreenManager() を使用する必要があります。 このメソッドを呼び出す前に、Application.onCreate() の中で ScreenManagerProvider.init(Application) を呼び出して、SurfaceDuoScreenManager のシングルトン インスタンスを初期化する必要があります。 この呼び出しは必須です。そうしないと、IllegalStateException("SurfaceDuoScreenManager must be initialized inside Application#onCreate()") 例外がスローされます。 SurfaceDuoScreenManager のインスタンスを作成した後、画面モードが変更されたときに通知を受けるために SurfaceDuoScreenManager.addScreenInfoListener(ScreenInfoListener?) を使用して ScreenInfoListener コールバックを登録できます。 複数のリスナーを追加することもできるので、メモリ リークを回避するために SurfaceDuoScreenManager.removeScreenInfoListener(ScreenInfoListener?) を使用して登録を解除する必要があることに留意してください。

また、構成の変更を処理することにした場合は、Activity から SurfaceDuoScreenManager.onConfigurationChanged(Configuration) を呼び出す必要があります。そうしないと、コールバックがトリガーされません。

class SampleApp : Application() {
    override fun onCreate() {
        super.onCreate()
        ScreenManagerProvider.init(this)
    }
}
class SampleActivity : AppCompatActivity(), ScreenInfoListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)
    }

    override fun onScreenInfoChanged(screenInfo: ScreenInfo) {
        if (screenInfo.isDualMode()) {
            // TODO: Add dual-screen behavior.
        } else {
            // TODO: Add single-screen behavior.
        }
    }

    override fun onResume() {
        super.onResume()
        ScreenManagerProvider.getScreenManager().addScreenInfoListener(this)
    }

    override fun onPause() {
        super.onPause()
        ScreenManagerProvider.getScreenManager().removeScreenInfoListener(this)
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        ScreenManagerProvider.getScreenManager().onConfigurationChanged()
    }
}

コールバックを登録せずに ScreenInfo オブジェクトを取得する必要がある別のオプションは、ScreenInfoProvider.getScreenInfo(Context) メソッドを使用することです。 ビューがウィンドウにアタッチされた後、このメソッドを呼び出す必要があることに注意してください。そうしないと、ScreenInfo からの一部のメソッドで null が返されるか、例外がスローされます。

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.let { rootView ->
            if (ViewCompat.isAttachedToWindow(rootView)) {
                val screenInfo = ScreenInfoProvider.getScreenInfo(this)
            } else {
                rootView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
                    override fun onViewAttachedToWindow(view: View) {
                        rootView.removeOnAttachStateChangeListener(this)
                        val screenInfo = ScreenInfoProvider.getScreenInfo(this)
                    }

                    override fun onViewDetachedFromWindow(view: View) {}
                })
            }
        }
    }
}

Core Ktx ライブラリを使用する場合は、次のようになります。

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.doOnAttach {
            val screenInfo = ScreenInfoProvider.getScreenInfo(this)
        }
    }
}