【问题标题】:Can't access EditText or other UI components with Kotlin无法使用 Kotlin 访问 EditText 或其他 UI 组件
【发布时间】:2017-10-23 05:21:57
【问题描述】:

我正在使用 Android Studio 3.0 RC2 和 Kotlin。

当我尝试访问 UI 组件时,除非我先编写 findViewById,否则应用程序会崩溃。我认为 Kotlin 应该摆脱写findViewById 行的麻烦? UI 是fragment,我正在尝试从相同的fragment 代码访问。有没有办法不必写 findViewById?

这些行有效:

var userNameField = view?.findViewById<EditText>(R.id.userNameTextField) as EditText
userNameField.setText("hello world")

如果没有 findViewById 行,此行将无法工作

userNameTextField.setText("hello world")

我什至有

import kotlinx.android.synthetic.main.fragment_sign_in.*

onCreateView() 代码:

 override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
    var view = inflater!!.inflate(R.layout.fragment_sign_in, container, false)

    var userNameField = view?.findViewById<EditText>(R.id.userNameTextField) as EditText
    userNameField.setText("hello world")

    return view
}

【问题讨论】:

  • 因为它不知道userNameFieldEditText
  • 显示你的onCreate方法
  • 您使用的是哪个 kotlin 版本?
  • 检查github.com/gradle/kotlin-dsl/issues/377。它可能对您有所帮助。
  • 视图名为userNameTextField,但您使用的是userNameField

标签: android kotlin android-studio-3.0 kotlin-extension


【解决方案1】:

在 onCreateView 中只返回膨胀的视图。

override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    // Inflate the layout for this fragment
return inflater!!.inflate(R.layout.fragment_sign_in, container, false)

}

在 onViewCreated 中你可以访问你的视图组件

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        userNameField.setText("hello world")
    }

【讨论】:

    【解决方案2】:

    我是通过搜索相同的问题被带到这里的。我错过了将 kotlin-android-extensions 添加到 build.gradle:

    apply plugin: 'kotlin-android-extensions'
    

    【讨论】:

      【解决方案3】:

      无法访问像 OP 一样的 ui 组件,在 app gradle 中需要如下所示:

      plugins {
          ...
          id 'kotlin-android-extensions'
      }
      

      即使在添加此行之后,android studio 仍然无法自动解析 kotlin 合成的导入,因此您可能需要使缓存无效并重新启动。

      如果仍然无法正常工作,请根据视图手动导入

      • 活动/片段视图:导入 kotlinx.android.synthetic.main..*
      • 普通视图: 导入 kotlinx.android.synthetic.main..view.*

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题。

        我有一个私人活动。我还导入了 kotlinx 库。但我无法从该函数访问 editText。

        我刚刚删除了函数并重新定义了它。

        瞧!它奏效了。

        【讨论】:

          【解决方案5】:

          对于那些在 2021 年遇到此问题的人:

          我知道过去有人问过这个问题,但由于它在这里仍然相关,我想帮助其他人: 今天我遇到了这个问题并尝试了建议的方法,不幸的是,

          plugins { ... id 'kotlin-android-extensions' }

          不再工作或更准确地说已被弃用,所以尝试使用 Jetpack 视图绑定方法,你会很好。

          我在添加 Gradle Kotlin Android 扩展依赖后得到的消息是: 'kotlin-android-extensions' Gradle 插件已弃用。请使用此迁移指南 (click here) 开始使用视图绑定。 (click here) 和 'kotlin-parcelize' 插件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-24
            • 2022-01-20
            • 1970-01-01
            • 1970-01-01
            • 2021-06-17
            相关资源
            最近更新 更多