java - 当我尝试从创建帐户页面切换到登录页面时,Android 应用程序崩溃
问题描述
这是登录片段的代码
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.package.example.MainActivity;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.List;
import static com.CreateAccountFragment.VALID_EMAIL_ADDRESS_REGEX;
/**
* A simple {@link Fragment} subclass.
*/
public class LoginFragment extends Fragment {
public LoginFragment() {
// Required empty public constructor
}
private EditText email_or_phone, password;
private Button login_button;
private TextView create_button,forgot_password;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_login, container,false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
init(view);
login_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
email_or_phone.setError(null);
password.setError(null);
if (email_or_phone.getText().toString().isEmpty()){
email_or_phone.setError("Required");
return;
}
if (password.getText().toString().isEmpty()){
password.setError("Required");
return;
}
if (VALID_EMAIL_ADDRESS_REGEX.matcher(email_or_phone.getText().toString()).find()){
login(email_or_phone.getText().toString());
}else if (email_or_phone.getText().toString().matches("\\d{10}")){
FirebaseFirestore.getInstance().collection("users").whereEqualTo("phone",email_or_phone.getText().toString())
.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()){
List<DocumentSnapshot> document = task.getResult().getDocuments();
if (document.isEmpty()){
email_or_phone.setError("This phone is not found");
return;
}else{
String email = document.get(0).get("email").toString();
login(email);
}
}else{
String error = task.getException().getMessage();
Toast.makeText(getContext(), error, Toast.LENGTH_SHORT).show();
}
}
});
}else {
email_or_phone.setError("Enter a legit Email or phone dude");
}
}
});
forgot_password.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((Registeractivity)getActivity()).setFragment(new ForgotpasswordFragment());
}
});
create_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((Registeractivity)getActivity()).setFragment(new CreateAccountFragment());
}
});
}
private void init(View view){
email_or_phone = view.findViewById(R.id.email);
password = view.findViewById(R.id.password);
login_button = view.findViewById(R.id.login_button);
create_button = view.findViewById(R.id.create_button);
forgot_password = view.findViewById(R.id.forgot_password);
}
private void login(String email){
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
firebaseAuth.signInWithEmailAndPassword(email,password.getText().toString()).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
Intent mainIntent = new Intent(getContext(), MainActivity.class);
startActivity(mainIntent);
getActivity().finish();
}else{
String error = task.getException().getMessage();
Toast.makeText(getContext(), error, Toast.LENGTH_SHORT).show();
}
}
});
}
}
这是 CreateAccount 片段的代码
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.Fragment;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.SignInMethodQueryResult;
import java.util.Objects;
import java.util.regex.Pattern;
/**
* A simple {@link Fragment} subclass.
*/
public class CreateAccountFragment extends Fragment {
public CreateAccountFragment() {
// Required empty public constructor
}
public static final Pattern VALID_EMAIL_ADDRESS_REGEX =
Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
public static final String EMAIL_REGEX = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$";
private EditText email, phone, password, confirm_password;
private Button create_button;
private TextView login_text;
private FirebaseAuth firebaseAuth;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_create_account, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
init(view);
firebaseAuth = FirebaseAuth.getInstance();
login_text.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = VERSION_CODES.KITKAT)
@Override
public void onClick(View view) {
((Registeractivity) Objects.requireNonNull(getActivity())).setFragment(new LoginFragment());
}
});
create_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
email.setError(null);
phone.setError(null);
password.setError(null);
confirm_password.setError(null);
if (email.getText().toString().isEmpty()){
email.setError("Required");
return;
}
if (phone.getText().toString().isEmpty()){
phone.setError("Required");
return;
}
if (password.getText().toString().isEmpty()){
password.setError("Required");
return;
}
if (confirm_password.getText().toString().isEmpty()){
confirm_password.setError("Required");
return;
}
if (!VALID_EMAIL_ADDRESS_REGEX.matcher(email.getText().toString()).find()){
email.setError("Enter a legit Email dude");
return;
}
if (phone.getText().toString().length() !=10){
phone.setError("Enter a legit Phone dude");
return;
}
if (!password.getText().toString().equals(confirm_password.getText().toString())) {
confirm_password.setError("It isn't matching. Chill pill & retype the password !");
return;
}
create_button();
}
});
}
private void init(View view) {
email = view.findViewById(R.id.email);
phone = view.findViewById(R.id.phone);
password = view.findViewById(R.id.password);
confirm_password = view.findViewById(R.id.confirm_password);
create_button = view.findViewById(R.id.create_button);
login_text = view.findViewById(R.id.login_button);
}
private void create_button(){
firebaseAuth.fetchSignInMethodsForEmail(email.getText().toString()).addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
@Override
public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
if (task.isSuccessful()){
if (task.getResult().getSignInMethods().isEmpty()){
((Registeractivity)getActivity()).setFragment(new OTPFragment(email.getText().toString(),phone.getText().toString(),password.getText().toString()));
}else{
email.setError("Email exists already dude");
}
}else{
String error = task.getException().getMessage();
Toast.makeText(getContext(), error, Toast.LENGTH_SHORT).show();
}
}
});
}
这是我从调试器得到的消息:
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.LoginFragment.onViewCreated(LoginFragment.java:118)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7331)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
解决方案
推荐阅读
- c# - 序列化成json并作为流返回
- sql - dbMail 连接的 url 将 & 符号解析为单词和
- python - django-models 星号 * 的哪个字段?
- mysql - sql查询错误外键约束给出错误
- javascript - AJAX 调用从 ASP.NET Core Web api 动态构建 DataTable
- javascript - 将 jquery 转换为纯 javascript 函数
- inner-join - Sql - 具有单列的内部连接表
- bash - 在 VS Code 任务中使用 .bash_profile 函数
- php - php在while中从上到下从json数据插入mysql
- ios - 如何获取位置 UIImageView。UIImageView 有很多