我们正在使用MvvmCross开发Xamarin.Android应用程序,该应用程序需要支持以下配置:
即对于手机,我们需要将方向锁定为纵向模式;对于平板电脑,则需要横向锁定。
我们尝试通过以下方法实现这一目标:
如该答案所示: https://stackoverflow.com/a/14793611/4207981
我们在值和values-sw600dp资源文件夹中设置布尔资源。
值:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="isTablet">false</bool>
</resources>
values-sw600dp:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="isTablet">true</bool>
</resources>
然后在Splash活动的OnCreate方法中,检查bool资源,并根据bool资源值检查设置为纵向还是横向的RequestedOrientation。
[Activity(
Theme = "@style/SplashScreenImage"
, MainLauncher = true
, NoHistory = true)]
public class SplashScreen : MvxSplashScreenActivity
{
protected override void OnCreate(Bundle bundle)
{
bool isTablet = Resources.GetBoolean(Resource.Boolean.isTablet);
if (isTablet)
RequestedOrientation = ScreenOrientation.Landscape;
else
RequestedOrientation = ScreenOrientation.Portrait;
base.OnCreate(bundle);
}
}
会发生什么?
当我在平板电脑上以纵向模式启动该应用程序时,
这与RustamGalljamov在Xamarin论坛帖子中所说的内容保持一致 https://forums.xamarin.com/discussion/2907/locking-orientation-android
我相信启动屏幕首先以纵向加载的原因是由于我们将主题设置为活动的属性
[Activity(
Theme = "@style/SplashScreenImage"
, MainLauncher = true
, NoHistory = true)]
当我们从“活动”属性中删除该主题并在检查活动的OnCreate中的设备类型后设置了主题时,
protected override void OnCreate(Bundle bundle)
{
bool isTablet = Resources.GetBoolean(Resource.Boolean.isTablet);
if (isTablet)
RequestedOrientation = ScreenOrientation.Landscape;
else
RequestedOrientation = ScreenOrientation.Portrait;
SetTheme(Resource.Style.SplashScreenImage);
base.OnCreate(bundle);
}
我们还尝试使用SetContentView而不是SetTheme扩大布局。这样一来,首先会显示白色屏幕,然后显示正确的布局,但是这次比SetTheme延迟了更多时间。
在本机android中,我已经看到这种方法可以很好地工作。但是在Xamarin.Android的情况下,我面临上述问题。
我们是在做错什么,还是可以根据设备类型来锁定活动方向?