xml onClick 中的 Kotlin 不起作用

Posted

技术标签:

【中文标题】xml onClick 中的 Kotlin 不起作用【英文标题】:Kotlin in xml onClick not work 【发布时间】:2017-04-14 14:28:00 【问题描述】:

我在学习 kotlin,现在对我来说不是很清楚。我有xml

<ImageView
                    android:id="@+id/aries"
                    android:layout_
                    android:layout_
                    android:padding="10dp"
                    android:tag="1"
                    android:onClick="clickItemHoro"
                    android:src="@drawable/aries" />

和片段

class ChooseYourHoroscope : Fragment()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? 
        val view = inflater.inflate(R.layout.fragment_welcome_old, container, false)

        return view;
    

    fun clickItemHoro(v: View?)
        Log.e("clickItemHoro", v!!.tag.toString())
    


当我点击按钮时出现错误:

在父级或祖先级中找不到方法 clickItemHoro(View) android:onClick 属性的上下文在视图类上定义 android.support.v7.widget.AppCompatImageView 与 id 'aries'

为什么会这样?代码很简单,但它不起作用,我不明白为什么

【问题讨论】:

Kotlin 在 xml onClick 中不起作用 ...它在 Java 中也不起作用 ...在父或祖先上下文中 .. . 片段是上下文吗? 我明白了,坦克! http://***.com/questions/14139774/android-app-crashing-fragment-and-xml-onclick 参考这个链接说。 【参考方案1】:

尝试使用 Kotlin Extensions 插件,它应该可以工作。

在 build.gradle (app) 添加apply plugin: 'kotlin-android-extensions'

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

然后在 MainActivity.kt 中导入它

import kotlinx.android.synthetic.main.activity_main.*

【讨论】:

我仍然在 3-6-18 的最新版本中遇到这个问题,但我在 Android Studio 中看不到它——我在使用 ./gradlew 构建时看到它命令行。我有插件、导入、Manifest.xml 工具:上下文行,所有这些。奇怪的是,即使 lint 告诉我它失败了,我的输出文件夹中仍然有一个 .apk。在 lint 领域可能存在一些脱节?由于在 Android Studio 中构建时不会真正发生 lint...【参考方案2】:

应用插件:'kotlin-android-extensions' 必须使用 kotlin 扩展然后才能工作

【讨论】:

【参考方案3】:

如上所述,添加 Kotlin 扩展是一个好主意,此外,您可以直接在代码中在 ImageView 上设置 onClickListener,而不是在 xml 文件中声明方法:onClick

aries.setOnClickListener doSomething()

【讨论】:

【参考方案4】:

在 Gradle 文件中添加

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

然后添加活动

   import kotlinx.android.synthetic.main.activity_main.*

【讨论】:

我仍然在 3-6-18 的最新版本中遇到这个问题,但我在 Android Studio 中看不到它——我在使用 ./gradlew 构建时看到它命令行。我有插件、导入、Manifest.xml 工具:上下文行,所有这些。奇怪的是,即使 lint 告诉我它失败了,我的输出文件夹中仍然有一个 .apk。在 lint 领域可能存在一些脱节?由于在 Android Studio 中构建时不会真正发生 lint...【参考方案5】:

根据上述答案和 cmets 在此处发布完整的解决方案,以便对其他人有所帮助。

首先从ImageView的xml代码中删除android:onClick属性。

然后修改片段代码如下:

class ChooseYourHoroscope : Fragment()
  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? 
      val view = inflater.inflate(R.layout.fragment_welcome_old, container, false)
      val aries = view.findViewById<ImageView>(R.id.aries)
      aries.setOnClickListener
          //Write ur action here
      

      return view;
   

【讨论】:

以上是关于xml onClick 中的 Kotlin 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 xml 定义的活动中找不到 onClick 方法

通过 XML HttpRequest 加载时 OnClick() 函数不起作用

如何在 Kotlin 中使用回调?

ListView 中的 Kotlin 可点击按钮

kotlin 中的 supportFragmentManager.commit 不起作用

如果将 Webview 作为子项,则布局 onClick 事件不起作用