Only fullscreen activities can request orientation

https://zhuanlan.zhihu.com/p/32190223
https://blog.csdn.net/youmangu/article/details/80678773

特征
當我們把targetSdkVersion升級到27,buildToolsVersion和相關的support library升級到27.0.1后,在Android 8.0(API level 26)上,部分Activity出現(xiàn)了一個莫名其妙的crash,異常信息如下:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.linkedin.android.XXXX.XXXX/com.linkedin.android.XXXX.XXXX.activity.LoginActivity}: java.lang.IllegalStateException: Only fullscreen activities can request orientation

如果一個Activity的Style符合下面三個條件之一,認為不是“fullscreen”:

“windowIsTranslucent”為true;
“windowIsTranslucent”為false,但“windowSwipeToDismiss”為true;
“windowIsFloating“為true;
綜上可見,這個改動的目的是想阻止非全屏的Activity鎖定屏幕旋轉,因為當前Activity是透明的,浮動的或可滑動取消的,是否鎖屏應該由全屏的Activity決定,而不是并沒有全部占據(jù)屏幕的Activity決定。

解決辦法:

1.targetSdkVersion <=26 即可

原因是sdk27版本使用:if targetSdkVersion is >=27 ( > android.os.Build.VERSION_CODES.O) you get this error, they have changed ActivityRecord in latest Android version adding this:

void setRequestedOrientation(int requestedOrientation) { if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen

            && appInfo.targetSdkVersion > O) {            throw new IllegalStateException("Only fullscreen activities can request orientation");        ....        }

2.不需要使用堅屏的不要使用如下代碼

設置鎖定堅屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 或者 android:screenOrientation="portrait"

3.這種方式有點low 可是暫時過渡方案(判斷版本號設置主題)

//8.1不能使用透明主題

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES. O) {

this.setTheme(R.style.A);//不透明

    }else {

this.setTheme(R.style.B);//透明主題

    }

如果使用該方法:

1.設置主題代碼放在 onCreate方法中的

super.onCreate(savedInstanceState);

設置主題代碼(setTheme)

setContentView(R.layout.activity);

2.manifest 中activity不要使用設置主題代碼

android:theme="@style/NoTitleDialog"

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容