You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中FAB设置android:onClick崩溃及绑定事件报错问题

解决Xamarin中Floating Action Button的两个点击事件问题

我来帮你搞定这两个头疼的问题!咱们一个一个来拆解:

问题1:设置android:onClick后点击崩溃

你遇到的Java.Lang.IllegalStateException,核心原因是Xamarin的C#方法不会自动暴露给Android的Java层。虽然你的方法签名看起来完全符合要求,但布局里的android:onClick是在Java侧查找对应方法,默认情况下你的C#方法不会被Java识别到。

这里有两种解决思路:

  • 方法一:给C#方法添加[Export]属性
    首先确保你的项目安装了Mono.Android.Export NuGet包,然后给点击方法加上[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:20:16