web-dev-qa-db-ja.com

DisplayCutoutを使用したフルスクリーンアプリ

ノッチの下にレイアウトされる実際のフルスクリーン機能を備えたアプリをどのように作成しますか?

私が欲しいものは次のとおりです。

Google Photos

ここに私が試したもののコードがあります:

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

レイアウト:

<?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>

スタイル:

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

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>

これまでに得た結果は次のとおりです。

enter image description here

さまざまなテーマを設定し、XML/Kotlinでフルスクリーンフラグを設定し、マニフェストでサイズ変更可能なアクティビティを設定しようとしましたが、アクティビティはノッチの下でレンダリングされません。

参考のため、これはプロジェクトのソースコードです。 https://gitlab.com/alvin.rusli/AndroidPTest

8
Alvin Rusli

ついにその理由がわかりました。奇妙な理由により、アプリケーションはif条件を入力しません。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    // It never gets here
}

条件とアクティビティが最終的に正しくフルスクリーンになった場合は削除しました。

Activity underneath the notch


アクティビティをフルスクリーンでレンダリングするために必要な最低限のコードは次のとおりです。

アクティビティ:

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

スタイル:

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

テーマにこれらのプロパティを設定します。

<item name="Android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="Android:windowTranslucentStatus">true</item>
<item name="Android:windowTranslucentNavigation">true</item>
3
Sofiane Majdoub

ノッチデバイス用アプリの開発中に同じ問題が発生しました。Android Pデバイスのテーマスタイルを定義し、default、shortEdges、neverモードなどのモードを設定することにより、この問題に対処します。

ステップ1:resディレクトリに新しいvalues-v28フォルダーを作成し、デフォルトのstyles.xmlファイルをそこにコピーします。

ステップ2:styles.xmlファイルのvalues-28バリアントで、アクティビティのテーマに移動するか、使用している場合は新しいテーマを作成しますデフォルトのもので、この属性を設定します:

<style name="ActivityTheme">
  <item name="Android:windowLayoutInDisplayCutoutMode">
    shortEdges
  </item>
</style>

アプリをより没入感のあるものにし、ノッチの両側にアプリのウィンドウをレンダリングすることでレターボックス化を回避するために必要なことはそれだけです。

enter image description here

ノッチデバイス用の互換性のあるアプリの開発について詳しく知るためのリンクはこちらです。 ノッチフレンドリーアプリの作成

3
Asad Mukhtar

何も動作しない場合は、これを一度試してください

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }
2
Sai Gopi N

これは、公式にまだリリースされていないときにAndroid Pを使用しているためです。おそらく、ベンダーに問題がある開発者プレビューがあります。システムでGoogleを検索して終了するとXDAページでは、おそらくAndroidバージョンのバグの中から「ベンダー」を見つけることができます。通常、開発者プレビューでは以前のAndroidバージョンなので、アプリはAndroid Oreoを以下の行で確認するときにOreoにあると考えます。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
1
Davide Cannizzo

次のスタイルを試してください、

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