特殊な形状のスクリーン、ノッチスクリーン、水滴スクリーンの有無を検出するコードが最後にあります。
Android 8.0 におけるさまざまな携帯電話メーカーの設定パラメータ:
<!-- 全面屏 vivo/oppo o版本刘海屏配置项 -->
<meta-data
android:name="android.max_aspect"
android:value="2.6" />
<!-- 刘海屏华为o版本配置,如果不配置则不使用华为o系统刘海区域 -->
<meta-data
android:name="android.notch_support"
android:value="true" />
<!-- 刘海屏小米o版本配置,如果不配置则不使用小米o系统刘海区域 -->
<meta-data
android:name="notch.config"
android:value="portrait|landscape" />
アクティビティは全画面に適応します。
Activity で onAttachedToWindow() メソッドをオーバーライドしても、OnCreate メソッドでは有効になりません。
/**
* 生命周期 onCreate->onStart->onResume->onAttachedToWindow
* 判断是否是异形屏,必须在此方法
*/
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
//适配安卓Q全面屏
setActivityAndroidP(this);
}
/**
* 安卓P(9.0系统) 适配Activity页面的全屏
*/
public static void setActivityAndroidP(Activity activity) {
//设置全屏展示
if (Build.VERSION.SDK_INT >= 28) {
if (activity != null && activity.getWindow() != null) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//全屏显示
WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
activity.getWindow().setAttributes(lp);
} else {
PlatformLog.e("activity全屏设置失败,activity或window为空");
}
}
}
Dialog または DialogFragment は全画面に適応します。
onActivityCreated(Bundle SavedInstanceState) メソッドをオーバーライドし、内部で呼び出します。
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//适配安卓Q全面屏
setDialogAndroidP(getDialog());
}
/**
* 安卓P(9.0系统) 适配dialogFragment页面的全屏
*/
public static void setDialogAndroidP(Dialog dialog) {
//设置全屏展示
if (Build.VERSION.SDK_INT >= 28) {
if (dialog != null && dialog.getWindow() != null) {
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//全屏显示
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
dialog.getWindow().setAttributes(lp);
} else {
PlatformLog.e("dialog全屏设置失败,dialog或window为空");
}
}
}
全画面設定が完了すると、Xiaomi Mi 11 携帯電話に仮想キー領域が表示されます。この領域はデフォルトでは黒で、画面全体と非常に不一致です。場合によっては全画面表示できないことがあります。解決策は次のとおりです。次のように:
アクティビティは、setContentView() 設定メソッドの前に設定されます。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//沉浸式
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//设置虚拟按键的背景颜色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setNavigationBarColor(Color.parseColor("#FFFF00"));
}
setContentView(R.layout.activity_main);
}
このコードは Dialog または DialogFragment に設定されていますが、仮想ボタンの背景色が有効にならず、アクティビティで次のテーマを設定している場合、仮想背景色を変更できないことがわかります。
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"
そこで、カスタム テーマを試してみることにしました。そして、最終的に効果を達成することに成功しました。
1. Dialog または DialogFragment の仮想背景色を個別に設定します。
value/styles.xml でカスタマイズします。
<!--设置虚拟按键navigationBarColor属性,安卓5.0之后生效,DialogFragment在代码中设置无效-->
<style name="dialog_fragment_navigationBarColor_style">
<item name="android:windowFullscreen">true</item>
</style>
Android 5.0 では仮想キーが導入されているため、values-v21/styles.xml を作成し、values/styles.xml でエラーを直接定義します。
<!--设置虚拟按键navigationBarColor属性,安卓5.0之后生效,DialogFragment在代码中设置无效-->
<style name="dialog_fragment_navigationBarColor_style">
<!-- 下面配置来自参数二setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);-->
<item name="android:windowFullscreen">true</item>
<item name="android:navigationBarColor">#FFFFFF</item><!--虚拟按键背景,DialogFragment在代码中设置无效-->
</style>
構成図は次のとおりです。
Dialog または DialogFragment の onCreate() メソッドで呼び出されます。
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.dialog_fragment_navigationBarColor_style);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getDialog() != null && getDialog().getWindow() != null) {
getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//沉浸式
}
}
2. アプリ全体に仮想ボタンの色を実装します。
1.values/styles.xml でカスタマイズします。
<!--适配全面屏和底部虚拟键背景的自定义style,直接使用@android:style/Theme.Light.NoTitleBar.Fullscreen会
导致底部虚拟键背景设置颜色失败-->
<style name="no_title_style">
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
2.values-v21/styles.xml を作成します。仮想キーは Android 5.0 で導入されたため、values/styles.xml でエラー レポートを直接定義します。
<!--适配全面屏和底部虚拟键背景的自定义style,直接使用@android:style/Theme.Light.NoTitleBar.Fullscreen会
导致底部虚拟键背景设置颜色失败-->
<style name="no_title_style">
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:navigationBarColor">#FFFF00<!--虚拟按键背景,DialogFragment在代码中设置无效-->
</style>
3. 上で定義したスタイルを Activet で均一に使用します。
<activity
android:name=".MainActivity"
android:theme="@style/no_title_style">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
最後に、Activity、Fragment、Dialog、DialogFragment がすべて全画面表示され、仮想ナビゲーションの背景色も正常に変更されました。
特殊な形状の画面検出については、私の他のブログを参照してください。ツールをコピーして使用してください。
https://blog.csdn.net/zhao8856234/article/details/117747273?spm=1001.2014.3001.5501