此问题已经在这里有了答案:
我是Kotlin的新手,我正在尝试创建一个身份验证简短应用程序。我的应用程序没有任何错误,但是当我要启动应用程序时会崩溃。
控制台调试系统显示以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.menu.a9dli3.ui.modifyFragment.ModifyFragment.onCreate(ModifyFragment.kt:24)
Kotlin视图片段代码在这里:
package com.menu.myapp.ui.modifyFragment
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.menu.a9dli3.R
import kotlinx.android.synthetic.main.register_activity.*
class ModifyFragment: Fragment() {
private lateinit var modifyviewmodel: ModifyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setOncreate(R.layout.fragment_modify_profile)
login_id.setOnClickListener {
val email = email_id.text.toString()
val password = password_id.text.toString()
Log.d("Login", "Attempt login with email/pw: $email/$password")
}
register_page_id.setOnClickListener {
performRegister()
}
}
private fun performRegister() {
val email = email_id.text.toString()
val password = password_id.text.toString()
if (email.isEmpty() || password.isEmpty()) {
Toast.makeText(context, "Please enter text in email/pw", Toast.LENGTH_SHORT ).show()
return
}
Log.d("MainActivity", "Email is: $email")
Log.d("MainActivity", "Password: $password")
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
modifyviewmodel =
ViewModelProviders.of(this).get(ModifyViewModel::class.java)
val root = inflater.inflate(R.layout.fragment_modify_profile, container, false)
val templatemode: TextView = root.findViewById(R.id.text_slidemodify)
modifyviewmodel.text.observe(this, androidx.lifecycle.Observer { templatemode.text = it })
return root
}
}
[请,我需要一些解释,而不仅仅是解决方案。
请遵循片段的生命周期。您需要根据生命周期在onViewCreated()
方法或onCreateView()
方法中实现点击侦听器。
您已经在创建片段视图之前调用了Click侦听器,这是一个大错误。没有创建视图,按钮如何执行点击事件?
此外,您还需要从onCreate()方法中删除setOncreate(R.layout.fragment_modify_profile)
。请检查以下代码:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
login_id.setOnClickListener {
val email = email_id.text.toString()
val password = password_id.text.toString()
Log.d("Login", "Attempt login with email/pw: $email/$password")
}
register_page_id.setOnClickListener {
performRegister()
}
}
您的register_page_id
尚未在onCreate()
中膨胀。仅在调用inflater.inflate()
后,视图才开始“存在”。
因此,要设置OnClickListener,请移动该行
register_page_id.setOnClickListener {
performRegister()
}
在return root
中onCreateView()
的正前方。
如果仍然崩溃,则将register_page_id
替换为root.findViewById<Button>(R.id.register_page_id )