Comment créer une application avec une fonctionnalité plein écran réelle, avec la mise en page à restituer sous l'encoche?
Voici ce que je veux:
Voici le code de ce que j'ai essayé:
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
val attrib = window.attributes
attrib.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
layout_main.setOnApplyWindowInsetsListener { _, windowInsets ->
val inset = windowInsets.displayCutout
Log.d("Tag", "Inset: $inset")
windowInsets
}
}
}
}
La disposition:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/layout_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#3000FFFF"
Android:fitsSystemWindows="true">
<View
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:background="#FFFF0000"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:background="#FF00FF00"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:background="#FF0000FF"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<View
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:background="#FFFF00"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<TextView
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:gravity="center"
Android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</Android.support.constraint.ConstraintLayout>
Le style:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:windowNoTitle">true</item>
<item name="Android:windowActionBar">false</item>
<item name="Android:windowFullscreen">true</item>
<item name="Android:windowContentOverlay">@null</item>
<item name="Android:windowTranslucentStatus">true</item>
<item name="Android:windowTranslucentNavigation">true</item>
</style>
Voici le manifeste Android:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.app.testandroidp">
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:roundIcon="@mipmap/ic_launcher_round"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
<activity
Android:name="com.app.testandroidp.MainActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Voici le résultat que j'ai obtenu jusqu'à présent:
J'ai essayé de définir différents thèmes, de définir l'indicateur de plein écran dans XML/Kotlin, de définir l'activité redimensionnable dans le manifeste, mais l'activité ne sera tout simplement pas restituée sous le cran.
Pour référence, ceci est le code source du projet: https://gitlab.com/alvin.rusli/AndroidPTest
J'ai finalement découvert pourquoi. Pour une raison étrange, l'application n'entre pas dans la condition if:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// It never gets here
}
J'ai supprimé que si condition et l'activité passe enfin en plein écran correctement.
Voici le minimum de codes requis pour rendre l’activité en plein écran.
Activité:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// or add <item name="Android:windowTranslucentStatus">true</item> in the theme
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
val attrib = window.attributes
attrib.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
}
Modes:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- Adding fullscreen will just hide the status bar -->
<!-- <item name="Android:windowFullscreen">true</item> -->
</style>
C'est parce que vous utilisez Android P alors que ce dernier n'était pas encore officiellement publié. Vous avez probablement un aperçu du développeur qui a des problèmes avec le fournisseur. Si vous recherchez votre système sur Google et que vous vous retrouvez dans une page XDA, vous serez probablement en mesure de trouver «Fournisseur» parmi les bogues de votre version Android. Habituellement, les aperçus des développeurs conservent le fournisseur de la version Android précédente. Votre application pense donc se trouver dans Android Oreo lorsque vous la recherchez dans la ligne ci-dessous:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
Essayez de suivre le style,
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="windowNoTitle">true</item>
<item name="Android:windowFullscreen">true</item>
</style>