转载请注明出处: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