尝试在空对象引用上调用虚拟方法 'void android.widget.TextView.setOnClickListener



我对kotlin和Android工作室的编码还很陌生,我正在努力解决一些问题:

"java.lang.RuntimeException:无法启动活动ComponentInfo{com.example.register.com/example.register。LoginActivity}:java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法"void android.widget.TextView.setOnClickListener(android.view.view$OnClickListener'(";

我在XLM文件上创建了一个按钮(位于文件末尾,名为gotoLogin(:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/tvEmail"
android:text="Register"
android:textSize="22sp"
android:textColor="@color/black"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tvEmail"
android:layout_width="match_parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="30dp"
android:hint="Enter Email"
android:layout_marginEnd="30dp"
android:layout_height="wrap_content">
<EditText
android:id="@+id/editEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:id="@+id/tvPassword"
app:layout_constraintTop_toBottomOf="@+id/tvEmail"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="30dp"
android:layout_marginTop="20dp"
android:hint="Enter Password"
android:layout_marginEnd="30dp"
android:layout_height="wrap_content">
<EditText
android:id="@+id/editPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"/>
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/clkRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Register"
android:textColor="@color/white"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvPassword"
android:layout_margin="30dp"
android:background="@color/colorAccent"/>
<Button
android:id="@+id/gotoLogin"
android:layout_width="wrap_content"
android:text="Login ?"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:padding="10dp"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

并添加了从我的MainActivity转到LoginActivity的选项(如果按下按钮(:

class MainActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
auth = FirebaseAuth.getInstance();
val nameBtnRegister = findViewById<Button>(R.id.clkRegister)
val nameEdtEmail = findViewById<EditText>(R.id.editEmail)
val nameEdtPwd = findViewById<EditText>(R.id.editPassword)
val nameGotoLogin = findViewById<TextView>(R.id.gotoLogin)
//Register the user
nameBtnRegister.setOnClickListener {
if (nameEdtEmail.text.trim().toString().isNotEmpty() || nameEdtPwd.text.trim()
.toString().isNotEmpty()
) {
createUser(nameEdtEmail.text.trim().toString(), nameEdtPwd.text.trim().toString())
} else {
Toast.makeText(this, "Input Required", Toast.LENGTH_LONG).show()
}
}
//Go to Login page
nameGotoLogin.setOnClickListener {
val intent = Intent(this,LoginActivity::class.java);
startActivity(intent)
}

但一旦我添加了这个选项,我就犯了错误。在这种情况下,这是我的登录活动:

class LoginActivity : AppCompatActivity() {
private lateinit var auth: FirebaseAuth;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
auth = FirebaseAuth.getInstance();
val btnLogin = findViewById<Button>(R.id.btnLogin)
val editTextEmail = findViewById<EditText>(R.id.editTextEmail)
val editTextPassword = findViewById<EditText>(R.id.editTextPassword)
val tvRegister = findViewById<TextView>(R.id.tvRegister)
tvRegister.setOnClickListener {
val intent = Intent(this, MainActivity::class.java);
startActivity(intent)
}

btnLogin.setOnClickListener {
if(editTextEmail.text.trim().toString().isNotEmpty() || editTextPassword.text.trim().toString().isNotEmpty()){
signInUser(editTextEmail.text.trim().toString(), editTextPassword.text.trim().toString());
}else{
Toast.makeText(this,"Input required",Toast.LENGTH_LONG).show();
}
}

}
fun signInUser(email:String, password: String){
auth.signInWithEmailAndPassword(email,password)
.addOnCompleteListener (this) { task ->
if(task.isSuccessful){
val intent = Intent(this, HomeActivity::class.java);
startActivity(intent)
}else{
Toast.makeText(this," Error !! "+task.exception, Toast.LENGTH_LONG).show()
}
}
}
}

和XML文件:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity">
<TextView
android:layout_width="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="Login"
android:textColor="#000"
android:textSize="22sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/textInputEmail"
android:layout_height="wrap_content"/>
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:hint="Enter Email"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:id="@+id/textInputEmail"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<EditText
android:id="@+id/editTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>

<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/textInputEmail"
android:hint="Enter Password"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:id="@+id/textInputPassword"
android:layout_marginTop="20dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<EditText
android:id="@+id/editTextPassword"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="30dp"
android:background="@color/colorAccent"
android:text="Login"
android:textColor="#fff"
app:layout_constraintTop_toBottomOf="@+id/textInputPassword"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tvRegister"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="Register ?"
android:textColor="@color/colorPrimaryDark"
android:padding="10dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

感谢您抽出时间

我认为你把TextView改成了Button,所以现在需要更改:

auth = FirebaseAuth.getInstance();
val nameBtnRegister = findViewById<Button>(R.id.clkRegister)
val nameEdtEmail = findViewById<EditText>(R.id.editEmail)
val nameEdtPwd = findViewById<EditText>(R.id.editPassword)
val nameGotoLogin = findViewById<TextView>(R.id.gotoLogin) // change here to Button not TextView

我认为应该是这样的:

val nameGotoLogin = findViewById<Button> (R.id.gotoLogin)

因为它是main_activity.xml中的按钮,而不是文本视图。

相关内容

最新更新