【问题标题】:How to add an onClickListener on a View in custom fragment?如何在自定义片段中的视图上添加 onClickListener?
【发布时间】:2021-06-10 22:26:39
【问题描述】:

我正在创建一个登录和注册表单。我创建了两个自定义片段,一个用于登录,一个用于注册。两者都有一些可点击的文本视图,我想将 onClickListener 添加到这些文本视图中,但是当我尝试从我的片段类访问这些视图时出现空指针异常。

我的自定义登录片段类:

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

主要活动:

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) 

【问题讨论】:

标签: java android kotlin android-fragments


【解决方案1】:

您在onCreate 中设置了点击侦听器,该侦听器在视图实例化之前被调用(在onCreateView 之前被调用),因此您从 Kotlin 合成获得的引用为空。像这样将你的点击监听器移动到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
        }
    }
}

【讨论】:

  • 谢谢! @阿明。它解决了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
相关资源
最近更新 更多