我正在尝试为我的Android应用在Xamarin中为纵向和横向模式创建两种不同的布局。
我已经为纵向模式创建了一个布局文件夹,为横向创建了布局图。当我打开特定页面时,将根据设备的方向加载正确的布局。但是,当我在打开页面时更改方向时,布局不会更改,只会旋转。我尝试覆盖mainActivity中的OnConfigurationChanged,但是我不确定如何仅为所需页面调用和加载布局。
public override void OnConfigurationChanged (Android.Content.Res.Configuration newConfig)
{
base.OnConfigurationChanged (newConfig);
if (newConfig.Orientation == Android.Content.Res.Orientation.Portrait) {
LayoutInflater li = (LayoutInflater)this.GetSystemService(Context.LayoutInflaterService);
SetContentView(Resource.Layout.myLayout);
}
else if (newConfig.Orientation == Android.Content.Res.Orientation.Landscape) {
SetContentView(Resource.Layout.myLayout);
}
}
此代码在方向更改时加载正确的布局,但是在方向更改时会被调用,并且发生在与该布局关联的所需页面之外。
在Xamarin.Forms中,您有诸如LayoutChanged
和SizeChanged
之类的事件,只要Page的Layout更改(包括创建页面时,以及当方向改变时,因此可能是一个不错的地方。
在下面@ jgoldberger-MSFT建议的文章中,Xamarin的团队建议使用SizeChanged
(阅读文章以获取更多详细信息!)
Xamarin.Forms不提供任何本地事件来通知您的应用共享代码的方向更改。但是,当页面的宽度或高度发生更改时,页面的SizeChanged事件就会触发。
[Xamarin.Forms中的ContentPage内,您可以简单地设置(超级基本示例):
public MainPage()
{
InitializeComponent();
SizeChanged += (s,a) =>
{
if (this.Width > this.Height ) // or any flag that you use to check the current orientation!
this.BackgroundColor = Color.Black;
else
this.BackgroundColor = Color.White;
};
}
在更新:
Android
的Page Renderer中,您仍然可以使用类似的LayoutChange
Handler:class Class1 : PageRenderer
{
public Class1(Context context) : base(context)
{
LayoutChange += (s, a) =>
{
};
}
}
希望这很有用...