Bagikan melalui


Surface Duo Screen Manager

Perhatian

Komponen ini sudah tidak digunakan lagi dan tidak lagi didukung.

Untuk mengambil informasi tentang area tampilan dan fitur lipat, Anda harus menggunakan Jetpack Window Manager.

Atau, gunakan salah satu kontrol dan tata letak layar ganda ini yang dapat secara otomatis beradaptasi dengan perangkat layar ganda dan foldabe.

SurfaceDuoScreenManager adalah protokol umum untuk dua implementasi pengelola layar yang berbeda, satu menggunakan pustaka Microsoft DisplayMask dan yang lainnya menggunakan pustaka Google WindowManager . Antarmuka ini mendefinisikan metode yang harus Anda gunakan untuk mendaftarkan dan membatalkan pendaftaran listener info layar.

Untuk membuat manajer layar, Anda harus menggunakan ScreenManagerProvider.getScreenManager(), yang akan mengembalikan instans singleton implementasi SurfaceDuoScreenManager . Sebelum memanggil metode ini, Anda harus memanggil ScreenManagerProvider.init(Application) di dalam Anda Application.onCreate() untuk menginisialisasi instans singleton .SurfaceDuoScreenManager Panggilan ini diperlukan; jika tidak, IllegalStateException("SurfaceDuoScreenManager must be initialized inside Application#onCreate()") pengecualian akan dilemparkan. Setelah Anda memiliki instans SurfaceDuoScreenManager, Anda dapat mendaftarkan ScreenInfoListener panggilan balik menggunakan SurfaceDuoScreenManager.addScreenInfoListener(ScreenInfoListener?) untuk diberi tahu ketika mode layar diubah. Perlu diingat bahwa Anda juga dapat menambahkan beberapa pendengar, jadi Anda harus membatalkan pendaftaran menggunakannya SurfaceDuoScreenManager.removeScreenInfoListener(ScreenInfoListener?) untuk menghindari kebocoran memori.

Selain itu, Jika Anda memutuskan untuk menangani perubahan konfigurasi, maka Anda harus memanggil SurfaceDuoScreenManager.onConfigurationChanged(Configuration) dari Anda Activity; jika tidak, panggilan balik tidak akan dipicu.

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()
    }
}

Opsi lain yang harus Anda ambil ScreenInfo objek tanpa perlu mendaftarkan panggilan balik adalah menggunakan metode .ScreenInfoProvider.getScreenInfo(Context) Perlu diingat bahwa Anda harus memanggil metode ini setelah tampilan dilampirkan ke jendela; jika tidak, beberapa metode dari ScreenInfo akan mengembalikan null atau akan melemparkan pengecualian.

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) {}
                })
            }
        }
    }
}

Jika Anda menggunakan pustaka Core Ktx , maka:

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)
        }
    }
}