web-dev-qa-db-fra.com

Application plein écran avec DisplayCutout

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:

 Google Photos

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:

 enter image description here

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

4
Alvin Rusli

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.

 Activity underneath the notch


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>
5
Alvin Rusli

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)
1
Davide Cannizzo

Essayez de suivre le style, 

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="Android:windowFullscreen">true</item>
</style>
0
Lucifer