如何推荐别人做网站,番禺做网站企业,公众号的关注怎么加微信,购物网站最重要的功能出现Only fullscreen opaque activities can request orientation是谷歌爸爸在安卓8.0版本时为了支持全面屏#xff0c;增加了一个限制#xff1a;如果是透明的Activity#xff0c;则不能固定它的方向#xff0c;因为它的方向其实是依赖其父Activity的#xff08;因为透明…出现Only fullscreen opaque activities can request orientation是谷歌爸爸在安卓8.0版本时为了支持全面屏增加了一个限制如果是透明的Activity则不能固定它的方向因为它的方向其实是依赖其父Activity的因为透明。然而这个bug只有在8.0中有8.1中已经修复。还有种原因是代码中手动取消App启动白屏或者黑屏的时候将Splash界面设为了透明然后这个时候又设置了方向为垂直从而导致了这个问题。总结具体原因有两种
1.Activity的风格为透明在manifest文件中指定了一个方向则在onCreate中崩溃
2.Activity的风格为透明如果调用setRequestedOrientation方法固定方向就会崩溃
解决方法
方法一
1.找到你设置透明的Activity然后在他的theme中将android:windowIsTranslucent改为false
即item nameandroid:windowIsTranslucentfalse/item
2.再加入item nameandroid:windowDisablePreviewtrue/item就搞定了。
方法二 如果项目结构复杂并不适合去修改配置文件则通过下面这段代码写是BaseActivity的成员方法其中稍难的就是如何获取com.android.internal.R$styleable.Window这个stylable记住$这个符号是等于代码中的“.”反射是需要写成$stylable其实是R的内部类获取到这个数组就可以用反射调用ActivityInfo#isTranslucentOrFloating()这个方法了。
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;}
在onCreate的时候先判断如果透明直接把方向改为SCREEN_ORIENTATION_UNSPECIFIED
Overrideprotected void onCreate(Bundle savedInstanceState) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.O isTranslucentOrFloating()) {boolean result fixOrientation();}super.onCreate(savedInstanceState);}private boolean fixOrientation(){try {Field field Activity.class.getDeclaredField(mActivityInfo);field.setAccessible(true);ActivityInfo o (ActivityInfo)field.get(this);o.screenOrientation -1;field.setAccessible(false);return true;} catch (Exception e) {e.printStackTrace();}return false;}
然后在重写setRequestedOrientation设置方向的时候如果透明直接不执行
Overridepublic void setRequestedOrientation(int requestedOrientation) {if (Build.VERSION.SDK_INT Build.VERSION_CODES.O isTranslucentOrFloating()) {return;}super.setRequestedOrientation(requestedOrientation);}
链接https://www.jianshu.com/p/f26774dc0f2e 来源简书 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。