原文:Android 8.0 Only fullscreen activities can request orientation解決方法 | Stars-One的雜貨小窩
公司的項目坑太多,現在适配高版本的出現了上面的這個問題..
個人項目中我一般不對這個Activity朝向orientation屬性進行更改
出現這個問題的原因是Android8.0的限制,隻有全屏(fullscreen)的Activity才能去設定橫/豎屏的方向,是以解決方法從下面幾個方向入手
分析
從版本入手,降低版本,低版本沒有這個限制
從Activity方向入手,取消設定橫/豎屏(也就是AndroidMainfest中删除Activity的orientation的屬性),或者是将Activity設定為全屏的
那麼怎麼知道Activity是不是屬于全屏的,由下面的屬性可以判斷(定義在style檔案裡)
1.“windowIsTranslucent”為true;
2.“windowIsTranslucent”為false,但“windowSwipeToDismiss”為true;
3.“windowIsFloating“為true;
符合上面的某點規則的,說明Activity不是fullScreen
我們按照上面的規則,在styles.xml檔案中定義好主題,之後給Activity設定即可
上面說的,可能項目的Activity過多,不好更改,還可以使用代碼的方式,将Activity的orientation屬性還原為預設值
SCREEN_ORIENTATION_UNSPECIFIED
(通過反射)
還有一點可以考慮,就是讓非全屏的Activity的orientation屬性設定
behind
,讓它跟随上個Activity保持相同的螢幕方向即可
基于以上的分析,總結得出下面幾種解決方法
解決方法
修改targetSdk版本
将build.gradle裡的targetSdk修改為26以下(包含26)

設定Activity為全屏
通過定義style.xml屬性,将Activity設定為全屏即可
符合上面的某點規則的,說明Activity不是fullScreen,按照上面的定義,反向設定即可,如
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="windowIsTranslucent">false</item>
<item name="windowSwipeToDismiss">false</item>
</style>
然後在AndroidManiFest.xml檔案中,給Activity設定style屬性,如
<activity
android:name="com.tjsoft.advice.ui.More"
android:screenOrientation="landscape"
android:theme="@style/AppTheme" />
通過反射重置orientation
具體參考Only fullscreen activities can request orientation終極解決方法_LiteHeaven的專欄-CSDN部落格,本人未測試過
設定orientation為behind
這種方法是将非fullscreen的Activity的orientation設定為behind,讓其螢幕方向和上個Activity相同,這樣就不會出現問題了
删除Activity設定的orientation屬性
這個是終極大法,就是不給Activity設定orientation,那麼就不會出現問題啦
參考
- Only fullscreen activities can request orientation?一個搞笑的坑! - 知乎
- Only fullscreen activities can request orientation終極解決方法_LiteHeaven的專欄-CSDN部落格
提問之前,請先看提問須知
點選右側圖示發起提問
或者加入QQ群一起學習
TornadoFx學習交流群:1071184701