ノッチの下にレイアウトされる実際のフルスクリーン機能を備えたアプリをどのように作成しますか?
私が欲しいものは次のとおりです。
ここに私が試したもののコードがあります:
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>
これまでに得た結果は次のとおりです。
さまざまなテーマを設定し、XML/Kotlinでフルスクリーンフラグを設定し、マニフェストでサイズ変更可能なアクティビティを設定しようとしましたが、アクティビティはノッチの下でレンダリングされません。
参考のため、これはプロジェクトのソースコードです。 https://gitlab.com/alvin.rusli/AndroidPTest
ついにその理由がわかりました。奇妙な理由により、アプリケーションはif条件を入力しません。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// It never gets here
}
条件とアクティビティが最終的に正しくフルスクリーンになった場合は削除しました。
アクティビティをフルスクリーンでレンダリングするために必要な最低限のコードは次のとおりです。
アクティビティ:
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>
テーマにこれらのプロパティを設定します。
<item name="Android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="Android:windowTranslucentStatus">true</item>
<item name="Android:windowTranslucentNavigation">true</item>
ノッチデバイス用アプリの開発中に同じ問題が発生しました。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>
アプリをより没入感のあるものにし、ノッチの両側にアプリのウィンドウをレンダリングすることでレターボックス化を回避するために必要なことはそれだけです。
ノッチデバイス用の互換性のあるアプリの開発について詳しく知るためのリンクはこちらです。 ノッチフレンドリーアプリの作成
何も動作しない場合は、これを一度試してください
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
これは、公式にまだリリースされていないときにAndroid Pを使用しているためです。おそらく、ベンダーに問題がある開発者プレビューがあります。システムでGoogleを検索して終了するとXDAページでは、おそらくAndroidバージョンのバグの中から「ベンダー」を見つけることができます。通常、開発者プレビューでは以前のAndroidバージョンなので、アプリはAndroid Oreoを以下の行で確認するときにOreoにあると考えます。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
次のスタイルを試してください、
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="windowNoTitle">true</item>
<item name="Android:windowFullscreen">true</item>
</style>