#java #android #firebase #passwords
#java #Android #firebase #пароли
Вопрос:
Для моего приложения для Android у меня есть кнопка «забыть пароль». В моем MainActivity.java , код работает нормально, чтобы нажать на кнопку «Забыть пароль?». и переводит пользователя в новое действие Java под названием ForgetPassword.java (Я следил за онлайн-уроком Mazn). Затем я продолжаю вводить свой адрес электронной почты (который уже зарегистрирован) и нажимаю «Отправить», чтобы отправить свое электронное письмо, на которое я забыл свой пароль. Это только возвращает меня к MainActivity.java , однако, я не думаю, что я называю это где-либо в своем Password.java функция.
Это мой Password.java функция: пакет com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.util.Patterns;
import android.view.View;
import android.widget.EditText;
import android.widget.Button;
import android.widget.ProgressBar;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
public class ForgotPassword extends AppCompatActivity {
private EditText emailEt;
private Button resetBtn;
private ProgressBar progressbar;
FirebaseAuth auth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_forgot_password);
progressbar = findViewById(R.id.progressBar4);
auth = FirebaseAuth.getInstance();
emailEt = findViewById(R.id.etEmail);
resetBtn = findViewById(R.id.btnReset);
resetBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = emailEt.getText().toString().trim();
progressbar.setVisibility(View.VISIBLE);
auth.sendPasswordResetEmail(email).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful())
{
Toast.makeText(getApplicationContext(), "Check your email to reset your password.", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), "Try again. Something went wrong!", Toast.LENGTH_LONG).show();
}
}
});
}
});
}
}
activity_forgot_password.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=".ForgotPassword">
<TextView
android:id="@ id/tvPetWatch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:fontFamily="sans-serif-black"
android:gravity="center_horizontal"
android:text="PetWatch"
android:textAlignment="center"
android:textSize="60sp"
android:textStyle="bold"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@ id/tvDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="The app that watches your pet!"
android:textStyle="italic"
android:textSize="18sp"
android:textAlignment="center"
app:layout_constraintBottom_toTopOf="@ id/etEmail"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/tvPetWatch"
app:layout_constraintVertical_bias="0.0"
android:gravity="center_horizontal" />
<EditText
android:id="@ id/etEmailAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="124dp"
android:ems="10"
android:hint="Enter email"
android:inputType="textEmailAddress"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/tvDescription"
app:layout_constraintVertical_bias="0.028" />
<Button
android:id="@ id/btnReset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="Reset Password"
android:textSize="24sp"
app:backgroundTint="#3F51B5"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/etEmailAddress"
app:layout_constraintVertical_bias="0.044" />
<ProgressBar
android:id="@ id/progressBar4"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:visibility="invisible"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/tvDescription"
app:layout_constraintVertical_bias="0.316" />
</androidx.constraintlayout.widget.ConstraintLayout>
Это мой MainActivity.java функция:
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Intent;
import android.util.Log;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;
import com.google.firebase.auth.AuthResu<
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
public class MainActivity extends AppCompatActivity {
private EditText eEmail;
private EditText ePassword;
private Button eLogin;
private TextView register;
private ProgressBar progressBar;
private TextView forgotPassword;
boolean isValid = false;
private int counter = 3;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Bind them to the XML layout
// findViewById attaches the particular value to the particular XML element
eEmail = findViewById(R.id.etEmail);
ePassword = findViewById(R.id.etPassword);
eLogin = findViewById(R.id.btnLogin);
register = findViewById(R.id.tvRegister);
FirebaseApp.initializeApp(MainActivity.this);
mAuth = FirebaseAuth.getInstance();
progressBar = findViewById(R.id.progressBar);
forgotPassword = findViewById(R.id.tvForgotPassword);
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.tvRegister:
startActivity(new Intent(MainActivity.this, RegisterUser.class));
break;
default:
throw new IllegalStateException("Unexpected value: " v.getId());
}
}
});
eLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.btnLogin:
{
userLogin();
break;
}
}
}
});
forgotPassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.tvForgotPassword:
startActivity(new Intent(MainActivity.this, ForgotPassword.class));
break;
default:
throw new IllegalStateException("Unexpected value: " v.getId());
}
}
});
}
private void userLogin() {
String email = eEmail.getText().toString().trim();
String password = ePassword.getText().toString().trim();
if (email.isEmpty())
{
eEmail.setError("Email is required!");
eEmail.requestFocus();
return;
}
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches())
{
eEmail.setError("Please enter a valid email address!");
eEmail.requestFocus();
return;
}
if (password.isEmpty())
{
ePassword.setError("Email is required!");
ePassword.requestFocus();
return;
}
progressBar.setVisibility(View.VISIBLE);
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful())
{
// direct to user profile
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user.isEmailVerified())
{
startActivity(new Intent(MainActivity.this, ProfileActivity.class));
Toast.makeText(getApplicationContext(), "Login credentials was successful!", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
else
{
user.sendEmailVerification();
Toast.makeText(getApplicationContext(), "Please check your email to verify your account.", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
}
else
{
Toast.makeText(getApplicationContext(), "Failed to login! Recheck your credentials.", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
}
});
}
}
activity_main.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=".MainActivity">
<EditText
android:id="@ id/etEmail"
android:layout_width="380dp"
android:layout_height="wrap_content"
android:layout_marginTop="60dp"
android:ems="10"
android:hint="Enter email address"
android:inputType="textEmailAddress"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.314" />
<Button
android:id="@ id/btnLogin"
android:layout_width="380dp"
android:layout_height="70dp"
android:layout_marginTop="24dp"
android:textStyle="bold"
android:ems="10"
android:text="Login"
android:textSize="24sp"
app:backgroundTint="#3F51B5"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/etPassword"
app:layout_constraintVertical_bias="0.097" />
<EditText
android:id="@ id/etPassword"
android:layout_width="380dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Enter password"
android:inputType="textPassword"
android:textSize="24sp"
android:layout_marginTop="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/etEmail"
app:layout_constraintVertical_bias="0.058" />
<TextView
android:id="@ id/tvPetWatch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:fontFamily="sans-serif-black"
android:gravity="center_horizontal"
android:text="PetWatch"
android:textAlignment="center"
android:textSize="60sp"
android:textStyle="bold"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@ id/tvDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="The app that watches your pet!"
android:textStyle="italic"
android:textSize="18sp"
android:textAlignment="center"
app:layout_constraintBottom_toTopOf="@ id/etEmail"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/tvPetWatch"
app:layout_constraintVertical_bias="0.0"
android:gravity="center_horizontal" />
<TextView
android:id="@ id/tvForgotPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Forgot Password?"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.056"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/btnLogin"
app:layout_constraintVertical_bias="0.096" />
<TextView
android:id="@ id/tvRegister"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New User? Register Here!"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.94"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/btnLogin"
app:layout_constraintVertical_bias="0.095" />
<ProgressBar
android:id="@ id/progressBar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Комментарии:
1. Пожалуйста, поделитесь этой функцией. auth.sendPasswordResetEmail
Ответ №1:
Ваш emailEt
находится в MainActivity, поэтому вызов findViewByID(R.id.etEmail)
действия ForgotPassword возвращает нулевую ссылку.
Когда я нажал кнопку сброса, кажется, что она перемещает MainActivity, но на самом деле приложение вылетает.
Мой локальный журнал:
2020-11-12 15:44:38.964 7425-7425/xyz.dps0340.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: xyz.dps0340.myapplication, PID: 7425
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at xyz.dps0340.myapplication.ForgotPassword$1.onClick(ForgotPassword.java:43)
at android.view.View.performClick(View.java:7448)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View.performClickInternal(View.java:7425)
at android.view.View.access$3600(View.java:810)
at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Вы должны использовать etEmailAddress
view в ForgotPassword activity.
Код:
Файлы Xml одинаковы.
MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.content.Intent;
import com.google.firebase.FirebaseApp;
import com.google.firebase.auth.FirebaseAuth;
public class MainActivity extends AppCompatActivity {
private EditText eEmail;
private EditText ePassword;
private Button eLogin;
private TextView register;
private ProgressBar progressBar;
private TextView forgotPassword;
boolean isValid = false;
private int counter = 3;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Bind them to the XML layout
// findViewById attaches the particular value to the particular XML element
eEmail = findViewById(R.id.etEmail);
ePassword = findViewById(R.id.etPassword);
eLogin = findViewById(R.id.btnLogin);
register = findViewById(R.id.tvRegister);
FirebaseApp.initializeApp(getApplicationContext());
mAuth = FirebaseAuth.getInstance();
progressBar = findViewById(R.id.progressBar);
forgotPassword = findViewById(R.id.tvForgotPassword);
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.tvRegister:
startActivity(new Intent(MainActivity.this, RegisterUser.class));
break;
default:
throw new IllegalStateException("Unexpected value: " v.getId());
}
}
});
eLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.btnLogin:
{
userLogin();
break;
}
}
}
});
forgotPassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.tvForgotPassword:
Intent forgotPasswordIntent = new Intent(MainActivity.this, ForgotPassword.class);
startActivity(forgotPasswordIntent);
break;
default:
throw new IllegalStateException("Unexpected value: " v.getId());
}
}
});
}
private void userLogin() {
String email = eEmail.getText().toString().trim();
String password = ePassword.getText().toString().trim();
if (email.isEmpty())
{
eEmail.setError("Email is required!");
eEmail.requestFocus();
return;
}
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches())
{
eEmail.setError("Please enter a valid email address!");
eEmail.requestFocus();
return;
}
if (password.isEmpty())
{
ePassword.setError("Email is required!");
ePassword.requestFocus();
return;
}
progressBar.setVisibility(View.VISIBLE);
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful())
{
// direct to user profile
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user.isEmailVerified())
{
startActivity(new Intent(MainActivity.this, ProfileActivity.class));
Toast.makeText(getApplicationContext(), "Login credentials was successful!", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
else
{
user.sendEmailVerification();
Toast.makeText(getApplicationContext(), "Please check your email to verify your account.", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
}
else
{
Toast.makeText(getApplicationContext(), "Failed to login! Recheck your credentials.", Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
}
});
}
}
ForgotPassword.java
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.util.Patterns;
import android.view.View;
import android.widget.EditText;
import android.widget.Button;
import android.widget.ProgressBar;
import android.os.Bundle;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
public class ForgotPassword extends AppCompatActivity {
private Button resetBtn;
private ProgressBar progressbar;
private EditText emailAddress;
FirebaseAuth auth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_forgot_password);
Intent intent = getIntent();
emailAddress = findViewById(R.id.etEmailAddress);
progressbar = findViewById(R.id.progressBar4);
auth = FirebaseAuth.getInstance();
resetBtn = findViewById(R.id.btnReset);
resetBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = emailAddress.getText().toString();
if(email.equals("")) {
Toast.makeText(getApplicationContext(), "Your Email is wrong.", Toast.LENGTH_LONG).show();
return;
}
progressbar.setVisibility(View.VISIBLE);
auth.sendPasswordResetEmail(email).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful())
{
Toast.makeText(getApplicationContext(), "Check your email to reset your password.", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(getApplicationContext(), "Try again. Something went wrong!", Toast.LENGTH_LONG).show();
}
progressbar.setVisibility(View.INVISIBLE);
}
});
}
});
}
}
Комментарии:
1. Пожалуйста, посмотрите Мой обновленный пост, чтобы включить мой MainActivity.xml так же , как и ForgetPassword.xml . Когда я пытаюсь ввести ваш пересмотренный код, мой eEmail.getText() не работает и выделяется красным. Прошу прощения, поскольку я новичок в разработке приложений на Java и Android в целом.
2. Извините, я опаздываю. Я только что улучшил свой ответ. это должно сработать.