【问题标题】:How to set Button onClick event handler declaratively?如何以声明方式设置 Button onClick 事件处理程序?
【发布时间】:2014-03-28 14:15:29
【问题描述】:

首先,我很抱歉,因为我确定以前有人问过这个问题,但我找不到答案:

我正在使用 Xamarin 编写一个 Android 应用程序。如何以声明方式设置事件处理程序?

目前我的 axml 中有一个按钮:

    Button
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/btnOne"
        android:textSize="30dp"
        android:text="1"
        android:onClick="btnOneClick"

我想在我的 Activity.cs 中触发 btnOneClick 方法:

 using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace AndroidMacScanner
{
[Activity(Label = "MacScanner", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity
{
    //int count = 1;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Login);

        // Get our button from the layout resource,
        // and attach an event to it
        //Button button = FindViewById<Button>(Resource.Id.MyButton);
        //button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };

        //EditText editText = FindViewById<EditText>(Resource.Id.txtPin);
        //editText.InputType = InputTypes;
    }

    public void btnOneClick(View v)
    {
        if (1 == 1) { };
    }
}
}

但是当我点击按钮时,我收到一条消息说应用程序已停止工作,没有其他详细信息。

编辑:添加了我的完整代码。 xml 不包含除上述相关内容之外的任何内容。 logcat 显示以下错误: 03-28 15:03:31.575 E/AndroidRuntime(5178): java.lang.IllegalStateException: 在视图类 android.widget.Button 上的视图类 android.widget.Button 的 onClick 处理程序的活动类 androidmacscanner.Activity1 中找不到方法 btnOneClick(View) 'btnOne'

所以找不到事件处理方法...

怎么了?

干杯,

詹姆斯

【问题讨论】:

  • 发布一些您的代码和 logcat。顺便说一句,单击按钮后您期望什么?移动到另一个活动或?
  • 到目前为止,这就是所有相关代码 - 我刚刚迈出了进入 Android 的第一步 :-)。该事件没有被触发,所以没有断点可以被击中,所以我看不到如何使用stacktace发布任何有用的东西?顺便说一句,我正在使用 Visual Studio 编写这个。
  • 制定了如何使用 logcat 并在上面发布了相关行。感谢您的提示!

标签: android xamarin


【解决方案1】:

您需要指定 将属性 [Java.Interop.Export] 添加到您的点击处理程序方法:

[Java.Interop.Export("btnOneClick")] // The value found in android:onClick attribute.
public void btnOneClick(View v) // Does not need to match value in above attribute.
{
   if (1 == 1) { };
}

【讨论】:

  • 我没有对此进行测试,但这是允许以声明方式设置事件处理程序的唯一答案,如我的示例所示。我唯一一次看到这个,所以我希望它对下一个有这个问题的人有用。
【解决方案2】:

有几种方法可以处理视图上的点击事件:

XML 方法(您帖子中的那个):

<!-- Declared in xml -->
<Button
    android:id="@+id/buttonDoStuff"
    android:layout_height="48dp"
    android:layout_width="96dp"
    android:onClick="doStuff"/>

// In your activity
public void doStuff(View view){// must reference a view
    // do some stuff
    System.out.println("Doing stuff woo hoo!");
}

Activity OnClickListener // xml中的onClick不包括

public class MyActivity extends Activity implements OnClickListener {

    @Override
    public void onClick(View view) {
        // handle clicks by view id
        if(view.getId() == R.id.buttonDoStuff){
            // Do stuff
        }
    }

或者您可以在代码中为按钮动态创建一个

    buttonDoStuff.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view){
            // Do stuff
        }
    });

仅在模拟器或实际设备上看到“应用程序已停止工作”,这就是所谓的 ANR(应用程序无响应)错误,当 dalivk jvm 终止应用程序进程时会发生这种错误。如果您使用 Eclipse 或 Android Studio 进行开发,您将需要检查您的 log cat 以获取详细的错误跟踪。这将帮助您在未来跟踪错误。

【讨论】:

  • 哦,抱歉没有意识到您使用 Xamarin,我的回答显示了如何在本地执行此操作。老实说,我建议学习本机方式。这将在以后省去很多麻烦,并且您的应用程序将更加强大和高效。
  • 我可能会来学习 Java,但由于我们的大部分代码都是后端代码,如果我能让 Xamarin 工作,那么我可以在 Windows Phone、iOS、Android 和甚至是 Windows,所以绝对值得一试!恐怕你会看到第一个绊脚石;-)
  • 虽然我当然同意混合应用程序对每个平台都有一个基础的诱惑,乍一看确实很吸引人,但您会发现有许多 x 因素会使事情变得困难。 (来自 exp)它们包括: - 就像 web 一样的跨浏览器兼容性问题 - 忽略每个平台的设计指南。 (在 iOS 上工作的东西可能不太适合 Android 或 Windows 手机的可用性模式) - 所有混合库总是落后于本地平台上的最新创新。借给缓慢、损坏和简单丑陋的应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多