Kotlin搜寻应用程序问题SetOnCreat方法

问题描述 投票:0回答:2

我是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)

crach log sniped picture

这里是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
    }
}

请提供一些解释,而不仅仅是解决方案。

android android-studio kotlin
2个回答
0
投票

您的register_page_id尚未在onCreate()中膨胀。仅在调用inflater.inflate()后,视图才开始“存在”。

因此,要设置OnClickListener,请移动该行

register_page_id.setOnClickListener {
     performRegister()
}

return rootonCreateView()的正前方

如果仍然崩溃,则将register_page_id替换为root.findViewById<Button>(R.id.register_page_id )


0
投票

请遵循片段的生命周期。您需要根据生命周期在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()
        }

    }
© www.soinside.com 2019 - 2024. All rights reserved.