如何在自定义片段中的视图上添加 onClickListener?
How to add an onClickListener on a View in custom fragment?
我正在创建一个登录和注册表单。我创建了两个自定义片段,一个用于登录,一个用于注册。两者都有一些可点击的文本视图,我想将 onClickListener 添加到这些文本视图,但是当我试图从我的片段 class.
访问这些视图时,我得到了空指针异常
我的自定义登录片段class:
package com.example.contactsaver
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.fragment_login.*
class LoginFragment: Fragment(){
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_login,null)
return view
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
tvNewAccount.setOnClickListener {
//todo
}
}
}
主要Activity:
package com.example.contactsaver
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val loginFragment = LoginFragment()
setFragment(loginFragment)
}
private fun setFragment(fragment: Fragment){
supportFragmentManager.beginTransaction().apply {
replace(R.id.flFragments,fragment)
commit()
}
}
}
这是错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.contactsaver.LoginFragment.onCreate(LoginFragment.kt:26)
您正在 onCreate
内设置您的点击侦听器,该侦听器在实例化视图之前被调用(在 onCreateView
之前被调用),因此您从 Kotlin synthetics 获得的引用为空。像这样
将您的点击侦听器移动到 onViewCreated
class LoginFragment: Fragment(){
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_login,null)
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tvNewAccount.setOnClickListener {
//todo
}
}
}
我正在创建一个登录和注册表单。我创建了两个自定义片段,一个用于登录,一个用于注册。两者都有一些可点击的文本视图,我想将 onClickListener 添加到这些文本视图,但是当我试图从我的片段 class.
访问这些视图时,我得到了空指针异常我的自定义登录片段class:
package com.example.contactsaver
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.fragment_login.*
class LoginFragment: Fragment(){
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_login,null)
return view
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
tvNewAccount.setOnClickListener {
//todo
}
}
}
主要Activity:
package com.example.contactsaver
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.fragment.app.Fragment
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val loginFragment = LoginFragment()
setFragment(loginFragment)
}
private fun setFragment(fragment: Fragment){
supportFragmentManager.beginTransaction().apply {
replace(R.id.flFragments,fragment)
commit()
}
}
}
这是错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.contactsaver.LoginFragment.onCreate(LoginFragment.kt:26)
您正在 onCreate
内设置您的点击侦听器,该侦听器在实例化视图之前被调用(在 onCreateView
之前被调用),因此您从 Kotlin synthetics 获得的引用为空。像这样
onViewCreated
class LoginFragment: Fragment(){
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_login,null)
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tvNewAccount.setOnClickListener {
//todo
}
}
}