如何強制App橫屏或者豎屏顯示應用

  最近開發應用的時候遇到一個需求,就是使用應用的時候需要強制橫屏顯示,本以爲是一個非常簡單的需要,可是真正在使用的時候卻遇到了麻煩。我的應用是一個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,歡迎評論,歡迎指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章