Xamarin.android 单击浮动操作按钮时,属性android:onClick=“FabOnClick”会使应用程序崩溃

Xamarin.android 单击浮动操作按钮时,属性android:onClick=“FabOnClick”会使应用程序崩溃,xamarin.android,visual-studio-2017,Xamarin.android,Visual Studio 2017,似乎没有太多人使用Xamarin for Visual Studio,因此没有太多特定于该平台的信息 话虽如此,我一直在尝试让一个浮动动作按钮晶圆厂的工作,这是相当的锻炼。在使用StackOverflow但无法让android:onClick=FabOnClick调用正常工作的好人的帮助下,我终于让它出现并将其分配给活动中的一个变量。单击FAB会导致应用程序崩溃,并出现以下错误: Unhandled Exception: Java.Lang.IllegalStateException: Coul

似乎没有太多人使用Xamarin for Visual Studio,因此没有太多特定于该平台的信息

话虽如此,我一直在尝试让一个浮动动作按钮晶圆厂的工作,这是相当的锻炼。在使用StackOverflow但无法让android:onClick=FabOnClick调用正常工作的好人的帮助下,我终于让它出现并将其分配给活动中的一个变量。单击FAB会导致应用程序崩溃,并出现以下错误:

Unhandled Exception:
Java.Lang.IllegalStateException: Could not find method FabOnClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.design.widget.FloatingActionButton with id 'fab' occurred
这是我的活动中的代码:

    public void FabOnClick(View v)
    {
        int x = 1;
    }
它实际上没有做任何事情,因为我现在只是想捕捉点击事件。我在intx=1行上设置了一个断点,以查看何时执行它。那么我错过了什么

*更新*

我根据@Digitalsa1nt的以下回答更新了我的活动代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Acr.UserDialogs;
using Android.Net;
using System.Net;
using Android.Support.Design.Widget;
using System.Threading.Tasks;
using Android.Views.InputMethods;
using static Android.Views.View;

namespace OML_Android
{
    [Activity(Label = "CreateAccount")]
    public class CreateAccount : Activity
    {
        public string result = "";
        public EditText aTextboxUsername;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.CreateAccount);

            RequestedOrientation = Android.Content.PM.ScreenOrientation.Portrait;


            aTextboxUsername = FindViewById<EditText>(Resource.Id.aTextboxUsername);
            EditText aTextboxPassword = FindViewById<EditText>(Resource.Id.aTextboxPassword);
            EditText aTextboxPassword2 = FindViewById<EditText>(Resource.Id.aTextboxPassword2);
            EditText txtEmailAddress = FindViewById<EditText>(Resource.Id.txtEmailAddress);
            EditText txtEmailAddress2 = FindViewById<EditText>(Resource.Id.txtEmailAddress2);

            EditText txtFirstName = FindViewById<EditText>(Resource.Id.first_name);
            EditText txtMI = FindViewById<EditText>(Resource.Id.mi);
            EditText txtLastName =  FindViewById<EditText>(Resource.Id.last_name);
            EditText txtAddress =  FindViewById<EditText>(Resource.Id.address);
            EditText txtCity = FindViewById<EditText>(Resource.Id.city);
            Spinner spnState =  FindViewById<Spinner>(Resource.Id.state);
            EditText txtZip = FindViewById<EditText>(Resource.Id.zip);
            MaskedEditText.MaskedEditText txtPhone = FindViewById<MaskedEditText.MaskedEditText>(Resource.Id.phone);
            Spinner spnCompany = FindViewById<Spinner>(Resource.Id.company_spinner);
            Spinner spnDept = FindViewById<Spinner>(Resource.Id.department_spinner);
            Spinner spnSection = FindViewById<Spinner>(Resource.Id.section_spinner);

            Button ButtonSubmit = FindViewById<Button>(Resource.Id.button_submit);
            ScrollView sv = FindViewById<ScrollView>(Resource.Id.scrollView1);
            ButtonSubmit.SetBackgroundColor(Android.Graphics.Color.YellowGreen);

            // Hide the keyboard (also doesn't work)
            InputMethodManager board = (InputMethodManager)GetSystemService(Context.InputMethodService);
            board.HideSoftInputFromWindow(aTextboxUsername.WindowToken, 0);


            // get the floating action button.
            FloatingActionButton myFab = FindViewById< FloatingActionButton>(Resource.Id.fab);
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            DataInterfaceWeb.DataInterface myService = new DataInterfaceWeb.DataInterface();


            myFab.Click += FabButton_Click(); // <-- get error here
            try
            {

                ConnectivityManager connectivityManager = (ConnectivityManager)GetSystemService(ConnectivityService);

                NetworkInfo activeConnection = connectivityManager.ActiveNetworkInfo;
                bool isOnline = (activeConnection != null) && activeConnection.IsConnected;

                if (!isOnline)
                {
                    showMessage("There is no internet or cell phone connection.  Connect to a network or connect to a cellular network.", "ERROR");
                }
            }
            catch (Exception ex)
            {
                showMessage("Connectivity Manager failed to create a connection due to error: " + ex.Message, "ERROR");
            };

            // Create your application here

            ButtonSubmit.Click += async (sender, e) =>
            {
                try
                {
                    result = myService.CheckForUser(Master.username, Master.password, aTextboxUsername.Text);
                    if (result.ToUpper() == "Y")
                    {
                        await showMessage("Username " + aTextboxUsername.Text + " is already in use.  Please choose another", "ERROR");
                        // aTextboxUsername.SetSelectAllOnFocus(true);
                        aTextboxUsername.RequestFocus();
                        View insideView = FindViewById<EditText>(Resource.Id.aTextboxUsername);
                        sv.ScrollTo(0, (int)insideView.GetY());
                        aTextboxUsername.SelectAll();
                    }

                }
                catch (Exception ex)
                {
                    showMessage("Account creation attempt failed due to error: " + ex.Message, "ERROR");
                }
            };

        }
        public async Task showMessage(string message, string messageType)
        {

            var result = await UserDialogs.Instance.ConfirmAsync(new ConfirmConfig
            {
                Message = messageType + System.Environment.NewLine + message,
                OkText = "Ok",

            });
        }
        public void FabButton_Click()
        {
            int x = 1;
        }
    }
}
我现在得到的错误是:
无法在myFab行上将“void”隐式转换为“SystemEventHandler”。请单击+=FabButton\u Click

所以我在这个答案中做了一些假设。首先,您使用的是一个Xamarin.Native项目,而不是一个Xamarin.Forms项目

其次,我假设您正在使用一个支持库中的floatingAction按钮,例如:Android.support.Design.Widget base/V4/V7

在AXML布局页面中定义晶圆厂后:

<android.support.design.widget.FloatingActionButton
      app:backgroundTint="@color/colourPrimary"
      android:id="@+id/fabButton"
      android:src="@drawable/image"
      app:fabSize="normal"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:elevation="16dp"
      android:translationZ="12dp"
      app:rippleColor="#ffa9a9a9" />
您可以从您的活动中获得:

using Android.Support.Design.Widget;

// declare variable
private FloatingActionButton fabButton;

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    // call base
    base.OnCreateView(inflater, container, savedInstanceState);

    // inflate our view
    var view = inflater.Inflate(Resource.Layout.MainTabWishlistPage, container, false);

    // get our instance of the button using the resource ID.
    fabButton = view.FindViewById<FloatingActionButton>(Resource.Id.fabButton);

    // assign to click event
    fabButton.Click += FabButton_Click;
}

private void FabButton_Click(object sender, EventArgs e)
{
     int x = 1;
}
上面的示例基于它是一个片段而不是一个活动,但方法是相同的

官方吉特回购:

随机在线指南:

如果这是一个Xamarin.Forms项目,请查看James Montemagno的library p.s,他是Xamarin上的开发人员之一,创建了大量的库来帮助您简化生活,当然可以查看他的其他repo


@Digitalsa1nt确实为我指明了正确的方向。而不是

fabButton.Click += FabButton_Click;
我刚刚连接了一个事件,正如错误所暗示的那样,duh:

myFab.Click += (sender, e) =>
{
    FabButton_Click();
};

现在它的工作原理和我预期的一样。

这显然对我也不起作用。我已经有了这里的大部分代码,但是有点不同。我编辑了我的问题以发布活动代码。很高兴它有帮助。