我正在尝试编写一个应用程序,我希望将手机锁定为纵向,但允许平板电脑版本同时具有横向和纵向。
我根据以下所有问题创造了几乎可以运作的东西......
How do I lock screen orientation for phone, but not for tablet? (Android) How to allow both landscape/portrait for tablets only Portrait for phone, landscape for Tablet (Android-Layout) landscape mode in tablet only Locking phone in portrait mode
我到目前为止所做的是将Activity扩展到我自己的基本Activity中,并在onCreate和覆盖的onConfigurationChanged中包含方向更改代码
@Override
protected void onCreate(Bundle savedInstanceState) {
if(!(new DeviceHelper().isTablet(this)))
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
super.onCreate(savedInstanceState);
setupActionBar(getActivity());
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
//don't reload the current page when the orientation is changed
if(!(new DeviceHelper().isTablet(this)))
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
super.onConfigurationChanged(newConfig);
}
所有这一切都运行正常(我覆盖了onConfigurationChanged以避免活动被破坏并重新创建,导致黑屏在几分之一秒内)。
我的主要问题是,如果您将手机放在风景中,那么活动将保持纵向...完美!但是,由于手机处于实际景观中,因此使用横向布局,这是平板电脑的布局。
我的理解是,当调用setRequestedOrientation时,它应立即触发onConfigurationChanged,但是,首先调用片段,然后布局不正确,然后调用onConfigurationChanged,这意味着已经设置了横向布局。
据我所知,我可以根据配置在每个活动中设置布局,但我真的不想这样做。
那么如何让应用程序根据setRequestedOrientation使用相应res文件夹中的相应布局文件。
由于
答案 0 :(得分:2)
如果您的横向布局仅适用于平板电脑,我建议您将其放入平板电脑布局文件夹中,即:layout-sw600dp-land(适用于7英寸平板电脑版)和layout-sw720dp-land(适用于10英寸平板电脑版)。这样,平板电脑布局将仅用于平板电脑。如果您没有为手机声明横向布局,则会使用常规纵向布局。分离平板电脑和手机布局的布局文件夹有助于组织。
答案 1 :(得分:1)
所有这一切都运行正常(我覆盖了onConfigurationChanged以避免活动被破坏并重新创建,导致黑屏在几分之一秒内)。
我很确定这是你问题的根源。您应该能够在不覆盖onConfigurationChanged
的情况下完成您要执行的操作。让操作系统处理配置更改并提供正确的布局文件。
如果你这样做,你应该对平板电脑很好。他们不应该设置特定的方向,他们应该打开每个活动的正确方向。手机设备会出现您正在谈论的快速黑屏问题。发生的事情是,活动将首先打开手机的方向,比如风景。然后它将在代码中将其方向设置为纵向并进行配置更改,重新创建活动并导致您看到的瞬间闪光。
有一些方法可以缓解这种情况。
在每个活动的android:screenOrientation="behind"
中使用AndroidManifest.xml
。这将以前一个活动所在的方向启动活动(手机的肖像,平板电脑的任何内容)。然后你永远不必担心Activity被创建两次,因为它总是以正确的方向开始。
但这并不能解决您的第一个活动。您可以在应用启动时处理具有该闪光灯的启动器活动,或者您可以将清单中的启动器活动设置为android:screenOrientation="portrait"
,并确保在代码中将平板电脑设置为setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
。这可能会导致平板电脑启动时发生闪光。
仅使用第一个项目符号应该足够好,但您应该根据应用程序的用户体验要求定制实施。