android刘海屏适配

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: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

展开阅读全文

没有更多推荐了,返回首页