这个问题在我targetSdkVersion=26时并未出现,当我把targetSdkVersion=28时才出现,但是它是出现在android8.0系统,也就是说android8.0>26时这个问题出现在8.0系统。
出现条件:
- 如果一个
targetSdkVersion>26
的Android App - 运行在
Android 8.0(含) 以上
的设备上时 - 如果启动的Activity为
透明Activity
时
问题就是在8.0系统android:screenOrientation="portrait"(或setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);) 与android:windowIsTranslucent=“true” 不能同时使用,原因自己去了解吧!就是8.0不能,8.1已修复。
然后网上说删除android:screenOrientation="portrait"或者去掉android:windowIsTranslucent=“true”就可以了,舍其一就没问题,但是我应用好像两个都需要,应用需要竖屏,使用侧滑返回需要activity透明,并且样式用得比较杂乱,所以想了比较简单的方式解决,如下:
在BaseActivity中加入:
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O && isTranslucentOrFloating()) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); }else{ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
就是判断是8.0系统并且是透明就不设置屏幕方向,否则设置。
判断透明方法:
private boolean isTranslucentOrFloating() { boolean isTranslucentOrFloating = false; try { int[] styleableRes = (int[]) Class.forName("com.android.internal.R$styleable").getField("Window").get(null); final TypedArray ta = obtainStyledAttributes(styleableRes); Method m = ActivityInfo.class.getMethod("isTranslucentOrFloating", TypedArray.class); m.setAccessible(true); isTranslucentOrFloating = (boolean) m.invoke(null, ta); m.setAccessible(false); } catch (Exception e) { e.printStackTrace(); } return isTranslucentOrFloating; }
这样就可以解决问题了