在主 activity 之外获取 EditText 的文本

Getting the Text of an EditText outside of the main activity

我刚开始使用 Kotlin 开发 Android 应用程序,运行 遇到以下问题: 我想建立一个小登录只是为了好玩。 我有点想这是因为我试图通过 v.findViewItemById() 获取文本,但找不到另一种 way/a 方法来绕过它
但是当执行应用程序时,我因错误
而崩溃 java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

我的MainActivity.kt:(删除导入)


class MainActivity : AppCompatActivity(){
    private lateinit var B: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        B = ActivityMainBinding.inflate(layoutInflater)
        setContentView(B.root)


        val btnListener = ButtonClickListener()
        B.btnLogin.setOnClickListener(btnListener)
    }
}

和 ButtonClickListener.kt:

package de.fynnhenck.login.listener

import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import de.fynnhenck.login.MainActivity
import de.fynnhenck.login.R
import java.security.AccessController.getContext

class ButtonClickListener : View.OnClickListener {
    override fun onClick(v: View?) {
        val bu = v as Button
        val loginText = v.findViewById<TextView>(R.id.tv_loginText)
        val username = v.findViewById<EditText>(R.id.et_username)

        val password = v.findViewById<EditText>(R.id.et_password)

            if(username.text.equals("user") and password.text.equals("pass")){
                loginText.text = "Test"
            }
    }
}

我希望这足以解释我的问题。 提前感谢您的帮助:)

我认为它会崩溃,因为 onClick(v: View?) 只包含您的按钮视图,而不包含您的其他 2 个 editText,这就是您得到的空值。

为什么是两个文件,而不是直接在MainActivity中添加这个逻辑?

B.btnLogin.setOnClickListener {
   if(B.username.text.equals("user") && B.password.text.equals("pass")){
      B.loginText.text = "Test"
    }
 }

当您调用 ViewfindViewById 时(btnLogin 是您的情况),它会尝试在降序视图之间进行查找。因此,由于 tv_loginText 不是按钮的子视图,因此这一行

val loginText = v.findViewById<TextView>(R.id.tv_loginText)

loginText 设置为 null

尝试通过绑定访问您的文本视图:

class MainActivity : AppCompatActivity(){
    private lateinit var B: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        B = ActivityMainBinding.inflate(layoutInflater)
        setContentView(B.root)


        val btnListener = ButtonClickListener()
        B.btnLogin.setOnClickListener(btnListener)
    }

    class ButtonClickListener : View.OnClickListener {
        override fun onClick(v: View?) {
            val bu = v as Button


            val loginText = B.tvLoginText // LIKE THIS
            ...
    }
}