Xamarin.Android多布局切换时无法从Layout2跳转至Layout3如何解决
问题根因
OnCreate生命周期方法仅会在Activity首次创建时执行一次:
- 首次启动Activity时你加载了Layout1,此时仅为Layout1的btnOne绑定了点击事件
- 点击btnOne切换到Layout2后,没有为Layout2中的btnTwo绑定点击事件,点击按钮自然没有响应,也不会触发报错
- 你额外编写的Layout2逻辑代码并未在切换布局后执行,所以无法触发跳转逻辑
解决方案
方案1:单Activity切换布局(适合简单场景)
所有布局复用同一个Activity,每次切换布局后手动绑定对应控件的事件,代码示例如下:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); LoadLayoutOne(); } private void LoadLayoutOne() { SetContentView(Resource.Layout.LayoutOne); Button btnOne = FindViewById<Button>(Resource.Id.btnOne); btnOne.Click += (s, e) => LoadLayoutTwo(); } private void LoadLayoutTwo() { SetContentView(Resource.Layout.LayoutTwo); Button btnTwo = FindViewById<Button>(Resource.Id.btnTwo); btnTwo.Click += (s, e) => SetContentView(Resource.Layout.LayoutThree); }
方案2:多Activity实现(Android官方推荐写法)
每个布局对应独立的Activity,跳转逻辑更清晰,后续扩展维护更方便:
- 新建两个Activity类:
LayoutTwoActivity、LayoutThreeActivity - 在
LayoutTwoActivity的OnCreate方法中加载Layout2布局,绑定btnTwo的点击事件 - 跳转使用Android原生的
Intent实现,示例代码如下:
主Activity(加载Layout1)跳转逻辑
private void btnOne_Click(object Sender, EventArgs e) { Intent intent = new Intent(this, typeof(LayoutTwoActivity)); StartActivity(intent); }
LayoutTwoActivity跳转逻辑
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.LayoutTwo); Button btnTwo = FindViewById<Button>(Resource.Id.btnTwo); btnTwo.Click += btnTwo_Click; } private void btnTwo_Click(object Sender, EventArgs e) { Intent intent = new Intent(this, typeof(LayoutThreeActivity)); StartActivity(intent); }
LayoutThreeActivity逻辑
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.LayoutThree); }
注意:Xamarin.Android中给Activity类添加[Activity]特性即可自动完成清单注册,无需手动修改AndroidManifest.xml。
内容的提问来源于stack exchange,提问作者Marissa
相关产品推荐
相关产品推荐

