android - 如何在 View.OnClickListener(kotlin, android) 中使用属性
问题描述
请理解使用翻译器。下面是我写的代码。
val lister = object : View.OnClickListener{
val textView1:TextView = findViewById(R.id.textView1)
val toggleButton1:ToggleButton = findViewById(R.id.toggleButton1)
override fun onClick(v: View?) {
if(toggleButton1.isChecked == true) {
textView1.text = "ON"
}else{
textView1.text = "OFF"
}
}
}
但是这段代码不起作用。错误名称是 E/AndroidRuntime: FATAL EXCEPTION: main 所以我修改它像下面的代码。
val lister1 = object : View.OnClickListener{
override fun onClick(v: View?) {
val toggleButton1:ToggleButton = findViewById(R.id.toggleButton1)
val textView1:TextView = findViewById(R.id.textView1)
if(toggleButton1.isChecked == true) {
textView1.text = "ON"
}else{
textView1.text = "OFF"
}
}
}
当我将 toggleButton1 和 textView1 属性移动到 onclick 函数时,它运行良好。但是我想知道为什么当我像第一个代码一样编写它时它不起作用。如果你让我知道,我将不胜感激。以下是整个错误。
E/AndroidRuntime:致命异常:主进程:kr.co.yeaeun.viewbasic,PID:11834 java.lang.RuntimeException:无法实例化活动ComponentInfo{kr.co.yeaeun.viewbasic/kr.co.yeaeun.viewbasic.MainActivity }:java.lang.NullPointerException:尝试在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3365) 的空对象引用上调用虚拟方法 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' ) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)在 android.app 的 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)。ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main (ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os .ZygoteInit.main(ZygoteInit.java:947) 原因:java.lang.NullPointerException:尝试在 android 的空对象引用上调用虚拟方法 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' .content.ContextWrapper.getApplicationInfo(ContextWrapper.java:173) 在 android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174) 在 android.content.Context.obtainStyledAttributes(Context.java:744) 在 androidx.appcompat.app。AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:839) 在 androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:806) 在 androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:630) 在 androidx.appcompat.app .AppCompatActivity.findViewById(AppCompatActivity.java:223) 在 kr.co.yeaeun.viewbasic.MainActivity$lister1$1.(MainActivity.kt:55) 在 kr.co.yeaeun.viewbasic.MainActivity.(MainActivity.kt:54)在 java.lang.Class.newInstance(Native Method) 在 android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) 在 androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) 在 android.app.Instrumentation .newActivity(Instrumentation.java:1253) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3353) 在 android.app。ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction .TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.os.Looper 的 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)。在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller 的 java.lang.reflect.Method.invoke(Native Method) 的 android.app.ActivityThread.main(ActivityThread.java:7656) 的循环(Looper.java:223)。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 运行(RuntimeInit.java:592)servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app .ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread。 main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:947)servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app .ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread。 main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal。 os.ZygoteInit.main(ZygoteInit.java:947)executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage (Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method ) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage (Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(Native Method ) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)223) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:第592章)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)223) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:第592章)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
完整代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView1:TextView = findViewById(R.id.textView1)
//val textView2:TextView = findViewById(R.id.textView2)
val toggleButton1:ToggleButton = findViewById(R.id.toggleButton1)
val toggleButton2:ToggleButton = findViewById(R.id.toggleButton2)
val button1:Button = findViewById(R.id.button1)
val button2:Button = findViewById(R.id.button2)
val button3:Button = findViewById(R.id.button3)
val button4:Button = findViewById(R.id.button4)
button1.setOnClickListener{
if(toggleButton1.isChecked == true){
textView1.text = "ON"
} else{
textView1.text = "OFF"
}
}
button2.setOnClickListener{
toggleButton1.isChecked = true
}
button3.setOnClickListener{
toggleButton1.isChecked = false
}
button4.setOnClickListener {
toggleButton1.toggle()
}
toggleButton1.setOnClickListener(lister1)
toggleButton2.setOnClickListener {
val textView2:TextView = findViewById(R.id.textView2)
if(toggleButton1.isChecked == true) {
textView2.text = "ON"
}else{
textView2.text = "OFF"
}
}
}
val lister1 = object : View.OnClickListener{
override fun onClick(v: View?) {
val toggleButton1:ToggleButton = findViewById(R.id.toggleButton1)
val textView1:TextView = findViewById(R.id.textView1)
if(toggleButton1.isChecked == true) {
textView1.text = "ON"
}else{
textView1.text = "OFF"
}
}
}
}
解决方案
View.CustomListener 不是视图。这是一个侦听器类。你需要像 next 一样使用 smth,但这是一个不好的方法。侦听器不应将 ui 视图保存为属性
class CustomView : View {
...
inner class CustomListener : View.OnClickListener{
val toggleButton1:ToggleButton = this@CustomView.findViewById(R.id.toggleButton1)
val textView1:TextView = this@CustomView.findViewById(R.id.textView1)
override fun onClick(v: View?) {
if(toggleButton1.isChecked == true) {
textView1.text = "ON"
}else{
textView1.text = "OFF"
}
}
}
}
如果 toggleButton1 和 textView 是听过的视图的孩子,那么你可以使用
val lister1 = object : View.OnClickListener{
override fun onClick(v: View?) {
val toggleButton1:ToggleButton? = view?.findViewById(R.id.toggleButton1)
val textView1:TextView? = view?.findViewById(R.id.textView1)
if(toggleButton1?.isChecked == true) {
textView1?.text = "ON"
}else{
textView1?.text = "OFF"
}
}
}
推荐阅读
- java - 如何正确解释转义序列 Java
- python - 为什么 Manim 遇到乳胶问题
- tree - 摆脱黑色背景樱桃树
- javascript - 如何中止下载音频流
- email - isync:“SSL 错误连接 mail.example.com ... 证书已过期”但证书尚未过期
- python - 如何根据特定数量的字符和数字过滤 DataFrame 中的行
- javascript - 映射嵌套数组,但返回 React 中的数字数组
- pytorch - 如何在 PyTorch 中进行批量点积?
- asp.net-mvc - 使用 MVC5,如何将集合数据绑定到 DropDownListFor
- reactjs - Reactjs如何在jsx中的onclick事件中传递参数