这是API 18中的一项功能,我无法让它实际锁定。我整晚都在阅读如何手动处理你自己的配置更改,并尝试了很多东西,但我现有的代码没有效果。
目标:我需要有一项活动,在用户拍摄视频(将其带回应用)后,目标网页应为横向或纵向,无论哪种方式用户正拿着电话。但是如果他们决定去景观,我想锁定那个位置,所以他们不能回到肖像(如果他们回去会导致视频查看错误)。所以他们在开始时有一个选择,但如果他们选择那个,那么他们必须留在风景中。但是我该怎么做呢?
这是我到目前为止所尝试的内容:
将此android:configChanges="keyboardHidden|orientation|screenSize"
放入清单中活动的<activity>
标记。
使用以下方法覆盖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);
}
}
我有2个xml布局,一个用于布局文件夹中的肖像,另一个用于布局 - 土地文件夹中的格局。
我得到的结果是我可以获得布局以显示方向更改,但我无法锁定它。我正在使用KitKat
的设备,所以它应该锁定在那里,但它没有。
这里的每一篇文章我都读过关于锁定方向(或其解决方法)似乎是3或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中设置方向标志。清单路线应该可以。