Bagikan melalui


Penangan status manajer fragmen

Penting

Artikel ini menjelaskan fungsionalitas dan panduan yang ada dalam pratinjau publik dan dapat dimodifikasi secara substansial sebelum tersedia secara umum. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Kelas FragmentManagerStateHandler ini membantu memulihkan fragmen saat transisi mode layar terjadi.

Saat kami mengubah mode aplikasi dari layar ganda ke mode layar tunggal, semua fragmen dibuat ulang meskipun tidak terlihat.

Menggunakan pustaka ini, hanya fragmen yang diperlukan yang dibuat ulang.

Fragmen dipulihkan dari bundel aktivitas. Pendekatan ini memiliki dua bundel yang ditukar pada runtime tergantung pada mode rentang. Ada satu bundel untuk layar tunggal dan satu lagi untuk mode rentang. Ini hanya dimungkinkan dengan menambahkan panggilan balik siklus hidup aktivitas dan menukar kedua bundel ini di onActivityPreCreated dalam panggilan balik.

Komponen secara otomatis mendeteksi mode layar. Ini hanya memulihkan fragmen yang kita butuhkan, tergantung pada mode layar.

Penting

Komponen hanya berfungsi dengan aktivitas dari AndroidX.

Cara menggunakan

class SampleApp : Application() {
    override fun onCreate() {
        super.onCreate()
        FragmentManagerStateHandler.init(this)
    }
}
class SampleActivity : AppCompatActivity() {
    companion object {
        private const val FRAGMENT_DUAL_START = "FragmentDualStart"
        private const val FRAGMENT_DUAL_END = "FragmentDualEnd"
        private const val FRAGMENT_SINGLE_SCREEN = "FragmentSingleScreen"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)
        registerWindowInfoFlow()
    }

    private fun registerWindowInfoFlow() {
        val windowInfoRepository = windowInfoRepository()
        lifecycleScope.launch(Dispatchers.Main) {
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
                windowInfoRepository.windowLayoutInfo.collectIndexed { index, info ->
                    if (index == 0) {
                        onScreenInfoChanged(info)
                    }
                }
            }
        }
    }

    /**
     * Called whenever the screen info was changed.
     * @param windowLayoutInfo object used to retrieve screen information
     */
    private fun onScreenInfoChanged(windowLayoutInfo: WindowLayoutInfo) {
        when {
            windowLayoutInfo.isInDualMode() -> setupDualScreenFragments()
            else -> setupSingleScreenFragments()
        }
    }

    /**
     * Adds fragments for the single screen mode
     */
    private fun setupSingleScreenFragments() {
        if (supportFragmentManager.findFragmentByTag(FRAGMENT_SINGLE_SCREEN) == null) {
            supportFragmentManager.inTransaction {
                replace(R.id.first_container_id, SingleScreenFragment(), FRAGMENT_SINGLE_SCREEN)
            }
        }
    }

    /**
     * Adds fragments for the dual screen mode
     */
    private fun setupDualScreenFragments() {
        if (supportFragmentManager.findFragmentByTag(FRAGMENT_DUAL_START) == null &&
            supportFragmentManager.findFragmentByTag(FRAGMENT_DUAL_END) == null
        ) {
            supportFragmentManager.inTransaction {
                replace(R.id.first_container_id, DualStartFragment(), FRAGMENT_DUAL_START)
            }

            supportFragmentManager.inTransaction {
                replace(R.id.second_container_id, DualEndFragment(), FRAGMENT_DUAL_END)
            }
        }
    }
}

inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> Unit) {
    val fragmentTransaction = beginTransaction()
    fragmentTransaction.func()
    fragmentTransaction.commit()
}

Langkah berikutnya

Pelajari tentang pustaka tata letak layar ganda lainnya.