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

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

<ImageView
                    android:id="@+id/aries"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    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'

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

【问题讨论】:

标签: android click fragment kotlin


【解决方案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;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多