简单点,开车的方式简单点
问:在什么情况下我们需要适配刘海屏?
答:应用在安卓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