android劉海屏適配
轉載請註明出處:https://blog.csdn.net/u011038298/article/details/83505697
簡單點,開車的方式簡單點
問:在什麼情況下我們需要適配劉海屏?
答:應用在安卓9.0系統中使用了全屏或者沉浸模式的時候。如果狀態列正常展示,則不需要適配劉海屏
問:沒有安卓9.0的手機,怎麼驗證和除錯應用劉海屏?
答:使用雲真機或者建立Androidstudio模擬器進行除錯
問:小老弟,安卓9.0的模擬器上沒看到劉海屏怎麼回事?
答:設定>系統>關於模擬裝置>高階>連續雙擊“版本號”直到成功開啟開發者模式>返回系統並找到開發者選項>找到模擬“劉海屏”>選擇劉海屏顯示型別
問:怎麼通過程式碼來實現安卓9.0“全屏模式”下的劉海屏的適配?
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 隱藏標題 requestWindowFeature(Window.FEATURE_NO_TITLE); Window window = getWindow(); // 如果需要設定全屏 window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowManager.LayoutParams lp = window.getAttributes(); /** * 官方Android 9 支援最新的全面屏, https://developer.android.com/about/versions/pie/android-9.0 * LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 僅僅當系統提供的bar完全包含了劉海區時,才允許window擴充套件到劉海區,否則window不會和劉海區重疊 * LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES 允許window擴充套件到劉海區 * LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 不允許window擴充套件到劉海區 */ lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; window.setAttributes(lp); } setContentView(R.layout.activity_main); } }
問:怎麼通過程式碼來實現安卓9.0“沉浸模式”下的劉海屏的適配?
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); } setContentView(R.layout.activity_main); // 頂部控制元件(用來充當狀態列的高度,顏色值與狀態列的顏色值保持統一) View topView = findViewById(R.id.top_view); int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { int height = getResources().getDimensionPixelSize(resourceId); if (height > 0) { ViewGroup.LayoutParams lp = topView.getLayoutParams(); lp.width = ViewGroup.LayoutParams.MATCH_PARENT; // 把頂部控制元件的高度設定成狀態列的高度 lp.height = height; topView.setLayoutParams(lp); } } } }
問:扎心了老鐵,為什麼我copy完程式碼後,卻找不到layoutInDisplayCutoutMode,連Build.VERSION_CODES.P都報錯?還提示cannot resolve symbol xxx,why?
答:請開啟app的build.gradle檔案,檢查一下配置
android {
// 編譯版本,android SDK版本
compileSdkVersion 28
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:palette-v7:28.0.0'
}
ok,Android P 劉海屏適配就到這裡,如果解決了你的劉海屏適配問題就贊一個吧~
另外,個別手機廠商劉海屏適配指南相關連結在這裡:
vivo手機適配指南
https://dev.vivo.com.cn/documentCenter/doc/103
小米劉海屏 Android O 適配
https://dev.mi.com/console/doc/detail?pId=1293
OPPO凹形屏適配說明
https://open.oppomobile.com/wiki/doc#id=10159
華為劉海屏手機安卓O版本適配指導
https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114