在主 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"
}
}
当您调用 View
的 findViewById
时(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
...
}
}
我刚开始使用 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"
}
}
当您调用 View
的 findViewById
时(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
...
}
}