1

这是 API 18 中的一个功能,我无法让它真正锁定。我一直在阅读如何手动处理自己的配置更改,并尝试了很多东西,但我目前的代码无效。

目标:我需要有一个活动,在用户拍摄视频(将他们带回应用程序)后,着陆页应该是横向或纵向的,无论用户以哪种方式握住手机。但是如果他们决定去横向,我想锁定那个位置,所以他们不能回到纵向(如果他们回去会导致视频观看错误)。所以他们一开始有一个选择,但如果他们选择那个,就必须留在风景中。但是我该怎么做呢?

这是我到目前为止所尝试的:

  1. 将其android:configChanges="keyboardHidden|orientation|screenSize"放在<activity>清单中我的活动标签中。

  2. 用这个覆盖onConfigurationChanged()方法:

        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
    
            if (getResources().getConfiguration().orientation ==
                    Configuration.ORIENTATION_LANDSCAPE) {
                setContentView(R.layout.activity_make_photo_video_land);
            } else {
                setContentView(R.layout.activity_make_photo_video);
            }
    
            if (this.getResources().getConfiguration().orientation ==
                    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE && Build.VERSION.SDK_INT
                    >= Build.VERSION_CODES.JELLY_BEAN_MR2){
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
            }
        }
    
  3. 我有 2 种 xml 布局,一种用于布局文件夹中的肖像,另一种用于 layout-land 文件夹中的风景。

我得到的结果是我可以让布局在方向改变时显示,但我不能让它锁定。我正在使用带有 的设备KitKat,所以它应该锁定在那里,但它没有。

我在这里读过的关于锁定方向(或解决方法)的每一篇文章似乎都有 3 或 4 年的历史,并且基本上暗示了我已经在尝试的内容。任何人有任何新信息吗?

谢谢。

4

4 回答 4

2

你试过这个吗?:

public static void lockOrientation(Activity activity) {
        Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int rotation = display.getRotation();
        int currentOrientation = activity.getResources().getConfiguration().orientation;
        int orientation = 0;
        switch(currentOrientation)
        {
        case Configuration.ORIENTATION_LANDSCAPE:
            if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
                orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            else
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
            break;
        case Configuration.ORIENTATION_PORTRAIT:
            if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
                orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
            else
                orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
        }
        activity.setRequestedOrientation(orientation);
    }

    public static void unlockOrientation(Activity activity) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
于 2015-03-31T09:54:40.167 回答
0

使用android:screenOrientation="portrait"来修复(锁定)您的屏幕方向并将其放入您的 android mainfest 文件中的特定活动下。纵向使用“portrait”,横向使用“lanscape”。就我而言,它对我有帮助,我认为它会帮助你尝试这个。

 <activity
        android:name=".MainActivity"
        android:label="@string/title_activity"
        android:screenOrientation="portrait" />
于 2015-03-31T09:23:11.507 回答
0

您可以在 Java 代码中这样做:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

有关更多信息,请参阅http://developer.android.com/reference/android/app/Activity.html#setRequestedOrientation(int)

但是 - 这并不是最好的主意。您所做的只是隐藏错误,这可能以其他方式发生(例如,如果用户在播放视频时锁定屏幕或接听电话)。方向锁定几乎不是答案。你应该阅读这个:http: //developer.android.com/guide/topics/resources/runtime-changes.html

于 2015-03-31T09:49:52.343 回答
0

这可能是一个迟到的答案。仍有困难的人可以继续阅读。

您不需要覆盖onConfigurationChanged().

只需在 Manifest 中设置 Activity 的标志即可,如下所示:

<activity android:name=".MainActivity"
            android:screenOrientation="landscape"
            android:configChanges="orientation|keyboardHidden"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">

...
...

</activity>

如果您仍然遇到问题,您可以设置多个方向标志,例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int o = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    o |= ActivityInfo.SCREEN_ORIENTATION_LOCKED;
    setRequestedOrientation(o);
    setContentView(R.layout.activity_main);
    ...
    ...
}

上面的 Java 代码将活动锁定为横向模式。在 Java 中从来不需要设置方向标志。清单路线应该有效。

于 2019-09-30T17:05:54.200 回答