首页 > 解决方案 > 如何在 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"
        }
    }
}

}

标签: androidkotlin

解决方案


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"
        }
    }
}

推荐阅读