Android 11设备(Motorola Defy)设置targetSdkVersion 22时应用底部黑边问题技术问询
解决targetSdkVersion=22在Android 11 Motorola Defy上的底部黑条问题
这种底部黑条的情况我之前在适配旧版本targetSdk的应用到新Android设备时也遇到过,核心原因是Android 10及以上系统对低targetSdk版本应用(<24)的“legacy app”适配逻辑:系统会默认认为这类应用没有适配现代设备的全屏/导航栏/挖孔屏特性,从而用黑条填充未被应用覆盖的区域;而当targetSdk升到24后,系统判定应用已经适配新特性,就会自动让应用铺满屏幕。
既然你需要保持targetSdkVersion=22来维持信息亭模式的权限优势,试试下面这几个针对性的解决方案:
1. 在主题中强制全屏适配
修改你的styles.xml,给AppTheme添加以下属性,让应用强制全屏并适配屏幕边缘:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- 适配挖孔屏/刘海屏,允许应用延伸到屏幕边缘 --> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <!-- 透明导航栏,让应用内容延伸到导航栏区域 --> <item name="android:windowTranslucentNavigation">true</item> <!-- 隐藏状态栏,全屏显示 --> <item name="android:windowFullscreen">true</item> <!-- 禁用系统自动预留安全区域 --> <item name="android:fitsSystemWindows">false</item> </style>
2. 在Activity代码中补充全屏设置
如果主题设置不生效,可以在PresetActivity的onCreate方法中添加代码,直接修改Window属性(注意适配Android P及以上的挖孔屏):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 适配Android P及以上的挖孔屏 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; getWindow().setAttributes(lp); } // 强制全屏+透明导航栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); setContentView(R.layout.activity_container); // ... 原有代码 }
3. 调整布局根视图的适配属性
修改你的activity_container.xml,确保根布局的fitsSystemWindows设为false,避免系统自动预留导航栏空间:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" android:background="@color/color_background" android:paddingTop="8dp" android:fitsSystemWindows="false" <!-- 添加这一行 --> tools:ignore="MergeRootFrame"> <!-- 原有布局内容 --> </RelativeLayout>
4. 添加宽高比适配Meta数据
有些厂商(比如Motorola)的设备会对应用支持的最大宽高比做限制,在AndroidManifest.xml的<application>标签内添加以下meta-data,告诉系统应用支持高宽比的屏幕:
<application android:name="xxxxx.xxxxApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <!-- 添加这一行 --> <meta-data android:name="android.max_aspect" android:value="2.1" /> <!-- 原有Activity配置 --> </application>
这些设置不会改变你targetSdkVersion=22的权限逻辑,同时能让系统把应用当作适配了现代屏幕的应用处理,从而消除底部黑条。
内容的提问来源于stack exchange,提问作者OneWorld
相关产品推荐
相关产品推荐

