【问题标题】:Button setOnClickListener() vs android:onclick按钮 setOnClickListener() 与 android:onclick
【发布时间】:2014-12-25 11:25:23
【问题描述】:

要注册OnClickListener,我总是在Button 上拨打setOnClickListener(listener)。现在我看到了一段代码,其中在布局中定义了点击事件,通过使用android:onclick="nameOfMethod" 并使用View 参数实现该方法。

这两种添加OnClickListener的方式有什么不同吗?推荐哪一个?

【问题讨论】:

  • 请注意,使用 onClick 方法应该在您的上下文中。在 Fragment 中执行此操作,您将必须在包含 Fragment 的 Activity 中定义方法。而且您必须确保 proguard 不会删除这些方法。

标签: android button


【解决方案1】:

在 XML 中绑定函数的 onClickonClick 与其调用的函数之间的绑定。该函数只有一个参数才能使onClick 起作用。

OnClickListener 是任何类都可以实现的接口。由于它是任何类都可以实现的接口,因此更加灵活。

如果需要,您可以轻松地将一个侦听器实现与另一个交换。

OnClickListener 使您能够将点击事件的操作/行为与触发事件的视图分开。虽然对于简单的情况这没什么大不了的,但对于复杂的事件处理,这可能意味着代码的可读性和可维护性更好

换句话说——

XML onClick 适用于 Java 代码中的一种固定实现。 OnClickListener 更适合更复杂的代码和多个按钮。但至于基本功能 - 它们都做完全相同的事情。

【讨论】:

    【解决方案2】:

    这两种添加 OnClickListener 的方式有什么不同吗?推荐哪一个?

    不,它们并没有什么不同,两者都可以工作,但根据我的经验,我不建议您使用 xml onClick 选项,原因很简单,xml 布局文件被创建为它们的名称来表示布局并表示视觉效果你设计的东西的一个方面。

    将 java 部分留给 java 文件:)

    【讨论】:

      【解决方案3】:

      我有

      我可以定义要调用的方法的活动布局

          <TextView
              android:id="@+id/search_hot_text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:clickable="true"
              android:onClick="onClickHotWords"
              android:text="@string/search_hot"
              />
      

      然后在 Java 中

      // defined in layout/search.xml
      public void onClickHotWords(View v){
          FSLogcat.d(TAG, "onClickHotWords");
          requestHotWords();
      }
      

      但我不得不将其重写为
      mSearchHotWordsLabel.setOnClickListener(new OnClickListener() {
      在片段内使用该布局时。

      mSearchHotWordsLabel 也存在与 proguard 相关的问题 见android:onClick not working with ProGuard

      【讨论】:

        猜你喜欢
        • 2011-05-08
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        相关资源
        最近更新 更多