最近開發應用的時候遇到一個需求,就是使用應用的時候需要強制橫屏顯示,本以爲是一個非常簡單的需要,可是真正在使用的時候卻遇到了麻煩。我的應用是一個Activity+多個Fragment來實現的,遇到的問題是我的Fragment裏面嵌套有視頻播放,我是用的是餃子播放器(需求不高,只要能簡單的播放一下視頻就可以了,哪位夥伴有其他好用的視頻播放器也可以留言推薦一下,謝謝),其他的時候設置了android:screenOrientation="landscape"
這句代碼就沒問題,可是點擊播放視頻就會變成豎屏,反正我是把我知道的方法都寫在了裏面,這裏記錄一下解決的辦法:
首先我們來看一下 android:screenOrientation 的屬性值:
android:screenOrientation=[“unspecified” | “user” | “behind” |“landscape” | “portrait” | “sensor” | “nonsensor”]
screenOrientation 用來指定Activity的在設備上顯示的方向,每個值代表如下含義:
“unspecified” 默認值 由系統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向.
“landscape” 橫屏顯示(寬比高要長)
“portrait” 豎屏顯示(高比寬要長)
“user” 用戶當前首選的方向
“behind” 和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
“sensor” 有物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
“nosensor” 忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了 ( "unspecified"設置除外 )。
一般來說,我是在設置App的主題style時候設置的,如下所示:
<!-- Base application theme. -->
<style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name = "colorPrimary">@color/colorPrimary</item>
<item name = "colorPrimaryDark">@color/colorPrimaryDark</item>
<item name = "colorAccent">@color/colorAccent</item>
<!--全應用都只允許橫屏-->
<item name="android:screenOrientation">landscape</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
但是設置了之後沒有效果,網上說的是不能全局設置,只能每個Activity都去單獨設置,如下所示:
<!-- tab主頁面 -->
<activity android:name = ".MainActivity"
android:configChanges = "orientation|screenSize|keyboardHidden"
android:hardwareAccelerated="true"
android:launchMode="singleTask"
android:screenOrientation="landscape"/>
這樣設置了之後點擊視頻播放還是會變成豎屏,所以我就去把網上能找到的辦法試了一下,有個讀者說是可以在自定義的Application裏面設置,如下所示:
//在自定義Application裏邊的onCreate()方法做個全局橫屏
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
//全局禁止豎屏
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
還有個是在Activity裏面的onCreate方法裏面代碼設置,如下所示:
super.onCreate(savedInstanceState);
if(getRequestedOrientation()!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
setContentView(R.layout.activity_main);
但是還是沒有用,播放視頻依然還是豎屏,於是我重寫了onConfigurationChanged方法,如下:
@Override
public void onConfigurationChanged(Configuration newConfig) {
if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
AppLogMessageMgr.i(TAG,"LANDSCAPE = " + String.valueOf(Configuration.ORIENTATION_LANDSCAPE));
}else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
AppLogMessageMgr.i(TAG,"LANDSCAPE = " + String.valueOf(Configuration.ORIENTATION_PORTRAIT));
}
//保持橫屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
super.onConfigurationChanged(newConfig);
}
這樣手動來設置橫屏就可以,但是 這樣的話就會有一個問題,App會先橫屏,然後再豎屏,最後是手動設置的橫屏,會出現屏幕倒轉的的一瞬間,哪位大佬看到了之後要是有好的方法,請您私信或者留言一下,謝謝。
轉載自:https://blog.csdn.net/u014727709/article/details/105790192
歡迎start,歡迎評論,歡迎指正