J'ai mis à jour la version de l'API cible du projet à 30, et maintenant je vois que la propriété systemUiVisibility est obsolète.
Le code kotlin suivant est celui que j'utilise et qui est en fait équivalent à la méthode setSystemUiVisibility en Java.
playerView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LOW_PROFILE
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)
Veuillez me faire savoir si vous avez un remplacement stable pour ce code obsolète. La recommandation de Google est d'utiliser WindowInsetsController , mais je ne sais pas comment faire cela.
6 Réponses :
J'espère que ça t'aide.
Auparavant, lors de la mise en œuvre de la navigation bord à bord ou du mode immersif, l'une des premières étapes à suivre était d'utiliser les indicateurs systemUiVisibility afin de demander à l'application d'être mise en plein écran.Cette nouvelle version d'Android désapprouve ce champ et afin de layout the app fullscreen, vous devez utiliser une nouvelle méthode sur la classe Window : setDecorFitsSystemWindows passant false comme argument comme ci-dessous.
// You have to wait for the view to be attached to the
// window (otherwise, windowInsetController will be null)
view.doOnLayout {
view.windowInsetsController?.show(WindowInsets.Type.ime())
// You can also access it from Window
window.insetsController?.show(WindowInsets.Type.ime())
}
WindowInsetsController classe qui vous permet de faire des choses qui étaient auparavant contrôlées via les indicateurs systemUiVisibility , comme masquer ou afficher la barre d'état ou la barre de navigation (masquer et afficher les méthodes, respectivement)
Par exemple, vous pouvez facilement afficher et masquer le clavier comme indiqué ci-dessous:
window.setDecorFitsSystemWindows(false)
window.setDecorFitsSystemWindows() nécessite le niveau d'API R. Comment puis-je résoudre le problème de compatibilité avec l'ancien niveau d'API?
Déclarez la propriété android: minSdkVersion sur le manifeste de l'application et définissez la valeur sur le niveau d'API de la version de la plateforme.
Cela signifie-t-il que setDecorFitsSystemWindows ne peut être utilisé que sur les appareils équipés d'Android R (dont la distribution est extrêmement réduite)?
Il définit si la vue de décor doit s'adapter aux vues de contenu de niveau racine pour WindowInsets. il semble que cela ne fonctionnera qu'avec l'API 30. Si cela ne fonctionne pas correctement. Faites une vérification de version
Ainsi, setDecorFitsSystemWindows ne peut pas être utilisé pour obtenir un plein écran pour l'API <30. Merci pour la clarification.
Depuis la version 1.5.0-alpha02 , androidx.core a WindowCompat.setDecorFitsSystemWindows()
Pour activer bord à bord:
WindowCompat.setDecorFitsSystemWindows(window, false)
Salut Phil, savez-vous comment nous pouvons implémenter view.windowInsetsController? .Hide (WindowInsets.Type.navigati onBars ()) ou window.insetsController? .Hide (WindowInsets.Type.navigationBa rs ()) de manière compartimentée en arrière ?
@Geob Google travaille sur la bibliothèque de support WindowInsetsController. source- youtube.com/watch?v=acC7SR1EXsI
WindowCompat.setDecorFitsSystemWindows(window, false) Watch this tutorial from official Android Developers channel.
TL; extrait DR
L'emballage dans la structure if-else est nécessaire pour éviter java.lang.NoSuchMethodError: No virtual method setDecorFitsSystemWindows exception de java.lang.NoSuchMethodError: No virtual method setDecorFitsSystemWindows sur les anciennes versions du SDK.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
window.setDecorFitsSystemWindows(false)
} else {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
}
Liens avec des informations complètes sur les inserts et les modes plein écran dans Android 11
https://blog.stylingandroid.com/android11-windowinsets-part1/
Vous pouvez également avoir une barre d'état translucide et vous pouvez le faire simplement en définissant un style sur le thème de votre application comme suit:
<style name="App.MyTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="android:windowLightStatusBar">true</item>
</style>
Un message de charpie peut être affiché (en fonction de votre niveau de l'API min curren): android: windowLightStatusBar nécessite le niveau d'API 23 (le minimum actuel est de 21) , vous devez donc remplacer ce thème dans les styles v23
Puisque vous voulez probablement avoir une minSdkVersion inférieure à 30, je vous recommande d'utiliser WindowCompat et WindowInsetsControllerCompat . Vous devrez mettre à niveau votre dépendance androidx.core pour androidx.core à au moins 1.5.0-alpha02
Vous pouvez trouver plus d'informations sur WindowInsets en regardant cette vidéo YouTube
private fun hideSystemUI() {
WindowCompat.setDecorFitsSystemWindows(window, false)
WindowInsetsControllerCompat(window, mainContainer).let { controller ->
controller.hide(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
private fun showSystemUI() {
WindowCompat.setDecorFitsSystemWindows(window, true)
WindowInsetsControllerCompat(window, mainContainer).show(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
}
@Doctinger trouvez-vous la solution? Je ne sais pas comment implémenter les solutions ci-dessous pour playerView dans exoplayer comme votre code. pourriez-vous plaire à votre mise en œuvre? :)