Xamarin中FAB设置android:onClick崩溃及绑定事件报错问题
我来帮你搞定这两个头疼的问题!咱们一个一个来拆解:
问题1:设置android:onClick后点击崩溃
你遇到的Java.Lang.IllegalStateException,核心原因是Xamarin的C#方法不会自动暴露给Android的Java层。虽然你的方法签名看起来完全符合要求,但布局里的android:onClick是在Java侧查找对应方法,默认情况下你的C#方法不会被Java识别到。
这里有两种解决思路:
- 方法一:给C#方法添加
[Export]属性
首先确保你的项目安装了Mono.Android.ExportNuGet包,然后给点击方法加上[Export]属性,注意属性里的字符串要和布局中android:onClick的值完全一致:using Android.Views; using Mono.Android.Export; public class YourActivity : AppCompatActivity { // ... 其他初始化代码 [Export("FabOnClick")] public void FabOnClick(View v) { int x = 1; // 这里写你的点击逻辑 } } - 方法二:用C#原生事件绑定(更推荐)
直接在代码里给FAB绑定点击事件,完全不用依赖布局里的android:onClick,更符合Xamarin的开发习惯,也能避免Export属性带来的兼容性问题:protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.YourLayout); var fab = FindViewById<FloatingActionButton>(Resource.Id.fab); fab.Click += FabOnClick; } private void FabOnClick(object sender, EventArgs e) { int x = 1; // 你的点击逻辑 }
问题2:绑定事件时出现Cannot implicitly convert 'void' to 'System.EventHandler'错误
这个错误是个小语法坑——你写了FabButton_Click(),加括号意味着你调用了这个方法,而不是把方法本身作为事件处理程序传递给Click事件。正确的写法是去掉括号,直接传递方法引用:
// 错误写法:加了括号,相当于调用方法并把void结果赋值给事件 // myFab.Click += FabButton_Click(); // 正确写法:传递方法引用 myFab.Click += FabButton_Click; // 对应的事件处理方法(注意签名是object sender, EventArgs e) private void FabButton_Click(object sender, EventArgs e) { int x = 1; // 你的点击逻辑 }
如果喜欢更简洁的写法,也可以用匿名方法:
myFab.Click += (sender, e) => { int x = 1; // 你的点击逻辑 };
内容的提问来源于stack exchange,提问作者Prescott Chartier
相关产品推荐
相关产品推荐

