1. 程式人生 > >android劉海屏適配

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