Kotlin中未解决的引用: findViewById

17
fun Tryouts() {
var CheckBox1 : CheckBox = findViewById(R.id.ForwardBox) as CheckBox
CheckBox1.setChecked(false)
}

我在 Kotlin 中仍然是一个初学者,只学习了 kotlin 的基本工作原理,我无法引用任何 Android 插件或更改其状态,无论是 TextView 还是 CheckBox 或 RadioBox,在 Android Studio 中都无法实现。
所有情况下 findViewById 都会出现相同的“未解决引用”错误...
我不知道我做错了什么,即使是将代码转换为 Java,也会输出相同的错误。


2
顺便提一下,我建议看一下Kotlin Android扩展,它可以消除findViewById()的需要。 - Michael Dodd
9个回答

15

似乎这是最简单的摆脱findViewById()方法的方式。

前往你的Build.Gradle文件(Module: app)

添加以下行

apply plugin: 'kotlin-android-extensions'
  • 然后它会要求您进行同步
  • 然后点击同步

之后转到您的活动文件,可能是MainActivity.kt

在那里导入 要导入单个视图

import kotlinx.android.synthetic.main.<layout_name>.<view_name>;

导入所有视图

import kotlinx.android.synthetic.main.<layout_name>.*;

示例: 在您的布局中

<Checkbox id="@+/forwardBox" . .  . />

它在 activity_main 布局中, 然后导入。

import kotlinx.android.synthetic.main.activity_main.forwardBox;

所以无论是在你的函数还是类中,直接使用它即可。

forwardBox.isChecked = false

5
“kotlin-android-extensions”已被弃用。 - RanH

6
在 Kotlin 中,您不需要使用 findViewById,只需从 kotlinx.android.synthetic.<your layout name> 使用 id ForwardBox 即可。Kotlin 会自动查找代码中使用的所有元素,并将它们赋值给与布局(xml)中相同的变量名作为 ids。
例如:
fun init(){
    ForwardBox.isChecked = false
}

3
尝试使用这个 val CheckBox1 = view.findViewById<CheckBox>(R.id.ForwardBox) 代码来适用于较新版本的Android Studio。

2
fun Tryouts() {
    val checkBox = findViewById(R.id.ForwardBox) as CheckBox
    checkBox.isChecked = false
}

无论如何,考虑使用下划线分隔的小写字母来定义你的ID,例如:

val checkBox = findViewById(R.id.forward_box) as CheckBox

我想在这种情况下,val 更好。 - Andrey Danilov
3
好的,这并没有回答提问者的问题:未解决的引用错误。 - Naetmul

1
我遇到了完全相同的问题,问题在于他们已经升级了所有内容以使用视图绑定, 尝试将其作为主类内的私有函数使用 class MainActivity:AppCompatActivity() - 我在那里成功了。

0

我曾经遇到过同样的问题,原因是我不小心在类外声明了函数,在那里无法使用AppCompatActivity的findViewById方法。

将其移回类的范围内,引用问题得到解决。


0

我是一个Android新手,对我来说下面的更改解决了问题。

var CheckBox1 = findViewById<CheckBox>(R.id.ForwardBox)


0
在 Kotlin 和/或 Android Studio 的新版本中,我刚刚执行了以下操作:
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-android-extensions'
}

(在 build.gradle [Module] 文件的顶部)
然后我回到我的活动代码中,写下了我的按钮名称(btn_search),Android Studio 完成了引用。
import kotlinx.android.synthetic.main.activity_main.*

-1

你的代码有误,请将其更改为以下内容。

fun Tryouts() {
    var CheckBox1 = findViewById(R.id.ForwardBox) as CheckBox
    CheckBox1.setChecked(false)
}

在 Kotlin 中,只需声明一个变量。例如:var abc abc 可以被任何类型的对象初始化。
如果我们需要从布局中获取视图,则必须编写:
findViewById(R.id.ForwardBox)

然后将该视图转换。

findViewById(R.id.ForwardBox) as CheckBox

然后存储在一个变量中。

var CheckBox1 = findViewById(R.id.ForwardBox) as CheckBox

8
不要说“你的代码有问题”,如果没有问题,问题就不存在了。相反,说些有用的东西,比如为什么会出错。 - Machado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接