ActivityInfo.SCREEN_ORIENTATION_LOCKED未锁定方向 - Android

时间:2015-03-31 09:02:04

标签: android android-layout android-configchanges

这是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布局,一个用于布局文件夹中的肖像,另一个用于布局 - 土地文件夹中的格局。

  4. 我得到的结果是我可以获得布局以显示方向更改,但我无法锁定它。我正在使用KitKat的设备,所以它应该锁定在那里,但它没有。

    这里的每一篇文章我都读过关于锁定方向(或其解决方法)似乎是3或4岁,基本上建议我已经尝试了。任何人都有的新信息?

    感谢。

4 个答案:

答案 0 :(得分:1)

你试过这个吗?:

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);
    }

答案 1 :(得分:0)

使用 android:scrreenOrientation =&#34;肖像&#34; 来修复(锁定)您的屏幕方向,并将其放入您的主要活动下的Android主要文件中。用于肖像用途&#34;肖像&#34;和景观用途&#34; lanscape&#34;。在我的情况下,它帮助我,我认为这将有助于你尝试这一点。

 <activity
        android:name=".MainActivity"
        android:label="@string/title_activity"
        android:screenOrientation="portrait" />

答案 2 :(得分: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

答案 3 :(得分:0)

这可能是一个较晚的答案。仍然有麻烦的人可以继续阅读。

您无需覆盖onConfigurationChanged()

只需在清单中为活动设置标志,如下所示:

<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中设置方向标志。清单路线应该可以。