【问题标题】:Android - I cant go to next activityAndroid - 我不能去下一个活动
【发布时间】:2020-10-04 02:48:02
【问题描述】:

这是我的日志。我尝试了这么多天,但无法解决错误。

com.example.project E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.project, PID: 5761
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5305)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
        at android.view.View.performClick(View.java:4780) 
        at android.view.View$PerformClick.run(View.java:19866) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5305) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.EditText com.google.android.material.textfield.TextInputLayout.getEditText()' on a null object reference
        at com.example.project.SignUp.validateFullName(SignUp.java:110)
        at com.example.project.SignUp.call2ndSignUpScreen(SignUp.java:50)
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
        at android.view.View.performClick(View.java:4780) 
        at android.view.View$PerformClick.run(View.java:19866) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5305) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

这是我的注册活动。从这个活动我想转移到第二个注册活动。它的代码在注册类代码下面。

package com.example.project;

import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Pair;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.google.android.material.textfield.TextInputLayout;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;


public class SignUp extends AppCompatActivity {
    ImageView backBtn;
    Button next, login;
    TextView titleText;
    TextInputLayout fullname, username, email, password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_sign_up);


        backBtn = (ImageView) findViewById(R.id.singup_back_btn);
        next = (Button) findViewById(R.id.singup_next_btn);
        login = (Button) findViewById(R.id.singup_login_btn);
        titleText = (TextView) findViewById(R.id.signup_title_text);


    fullname = (TextInputLayout) findViewById(R.id.signup_fullname);
    username = (TextInputLayout) findViewById(R.id.signup_username);
    email = (TextInputLayout) findViewById(R.id.signup_email);
    password = (TextInputLayout) findViewById(R.id.signup_password);


    }

    public void call2ndSignUpScreen(View view) {

        if (!validateFullName() | !validateUserName() | !validateEmail() | !validatePassword()) {
            return;
        }


        String fullName =fullname.getEditText().getText().toString();
        String userName =username.getEditText().getText().toString();
        String Email =email.getEditText().getText().toString();
        String Password =password.getEditText().getText().toString();
        UserHelperClass helperclass = new UserHelperClass();

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference("Users");

        myRef.setValue(helperclass);

        Intent intent = new Intent(getApplicationContext(), SignUp2ndClass.class);

        intent.putExtra("fullname", fullName);
        intent.putExtra("username", userName);
        intent.putExtra("email", Email);
        intent.putExtra("password", Password);


        Pair[] pairs = new Pair[4];
        pairs[0] = new Pair<View, String>(next, "transition_back_btn");
        pairs[1] = new Pair<View, String>(next, "transition_title_text");
        pairs[2] = new Pair<View, String>(next, "transition_next_btn");
        pairs[3] = new Pair<View, String>(next, "transition_login_btn");


        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(SignUp.this, pairs);
        startActivity(intent, options.toBundle());
    }


    public void callstartupscreen(View view) {

        Intent intent = new Intent(getApplicationContext(), StartUpScreen.class);

        Pair[] pairs = new Pair[1];
        pairs[0] = new Pair<View, String>(findViewById(R.id.singup_back_btn), "signup_transition_back_btn");

        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(SignUp.this, pairs);
        startActivity(intent, options.toBundle());
    }

    public void callLoginScreen(View view) {

        Intent intent = new Intent(getApplicationContext(), LogIn.class);

        Pair[] pairs = new Pair[1];
        pairs[0] = new Pair<View, String>(findViewById(R.id.singup_login_btn), "transition_login_btn");

        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(SignUp.this, pairs);
        startActivity(intent, options.toBundle());
    }

    private boolean validateFullName() {

        String val = fullname.getEditText().getText().toString().trim();

        if (val.isEmpty()) {
            fullname.setError("Field can not be Empty");
            return false;
        } else {
            fullname.setError(null);
            fullname.setErrorEnabled(false);
            return true;
        }
    }

    private boolean validateUserName() {

        String val = username.getEditText().getText().toString().trim();
        String checkspaces = "\\A\\w{1,20}\\z";

        if (val.isEmpty()) {
            username.setError("Field can not be Empty");
            return false;
        } else if (val.length() > 20) {
            username.setError("Username is too large");
            return false;
        } else if (!val.matches(checkspaces)) {
            username.setError("No white spaces are allowed!");
            return false;
        } else {
            username.setError(null);
            username.setErrorEnabled(false);
            return true;
        }
    }

    private boolean validateEmail() {

        String val = email.getEditText().getText().toString().trim();
        String checkEmail = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";

        if (val.isEmpty()) {
            email.setError("Field can not be Empty");
            return false;
        } else if (!val.matches(checkEmail)) {
            email.setError("Invalid Email!");
            return false;
        } else {
            email.setError(null);
            email.setErrorEnabled(false);
            return true;
        }
    }

    private boolean validatePassword() {

        String val = password.getEditText().getText().toString().trim();
        String checkPassword = "^" +
                "(?=.*[a-zA-Z])" +
                "(?=.*[@#$%^&+=])" +
                ".{4,}" +
                "$";

        if (val.isEmpty()) {
            password.setError("Field can not be Empty");
            return false;
        } else if (!val.matches(checkPassword)) {
            password.setError("Password is weak Try another one!");
            return false;
        } else {
            password.setError(null);
            password.setErrorEnabled(false);
            return true;
        }
    }


}

这是我的第二个注册活动。我无法通过单击其 xml 文件中具有 onclick 功能的按钮来移动到此活动。我在整个项目中添加的所有其他按钮都在工作。我总共有 3 个在我上次注册活动中单击下一步按钮后的注册活动,数据将保存在 Firebase 中。但不幸的是,我无法从我的第一次注册活动中继续前进。

package com.example.project;

import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.util.Pair;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class SignUp2ndClass extends AppCompatActivity {


    ImageView backBtn;
    Button next, login;
    TextView titleText;

    RadioGroup radioGroup;
    RadioButton selectGender;
    DatePicker datePicker;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_sign_up2nd_class);



        backBtn = findViewById(R.id.singup2_back_button);
        next = findViewById(R.id.singup2_next_button);
        login = findViewById(R.id.singup2_login_btn);
        titleText = findViewById(R.id.signup2_title_text);
        radioGroup = findViewById(R.id.radio_group);
        datePicker = findViewById(R.id.age_picker);

    }


    public void call3rdSignUpScreen(View view) {

        if(!validateGender()){
            return;
        }

        selectGender =findViewById(radioGroup.getCheckedRadioButtonId());
        String _gender = selectGender.getText().toString();
        int day = datePicker.getDayOfMonth();
        int month = datePicker.getMonth();
        int year = datePicker.getYear();

        String _date = day+"/"+month+"/"+year;
        String fullname = getIntent().getStringExtra("fullname");
        String username = getIntent().getStringExtra("username");
        String email = getIntent().getStringExtra("email");
        String password = getIntent().getStringExtra("password");

        Intent intent = new Intent(getApplicationContext(), SignUp3rdClass.class);

        Pair[] pairs = new Pair[4];
        pairs[0] = new Pair<View, String>(next, "transition_back_btn");
        pairs[1] = new Pair<View, String>(next, "transition_title_text");
        pairs[2] = new Pair<View, String>(next, "transition_next_btn");
        pairs[3] = new Pair<View, String>(next, "transition_login_btn");


        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(SignUp2ndClass.this, pairs);
        startActivity(intent, options.toBundle());
    }


    private boolean validateGender(){

        if(radioGroup.getCheckedRadioButtonId()==-1){
            Toast.makeText(this, "Please Select Gender", Toast.LENGTH_SHORT).show();
            return false;
        }else{
            return true;
        }
    }

    public void callLoginScreen (View view){

        Intent intent = new Intent(getApplicationContext(),LogIn.class);

        Pair[] pairs = new Pair[1];
        pairs[0] = new Pair<View, String>(findViewById(R.id.singup2_login_btn),"transition_login_btn");

        ActivityOptions options=ActivityOptions.makeSceneTransitionAnimation(SignUp2ndClass.this,pairs);
        startActivity(intent,options.toBundle());
    }

}

【问题讨论】:

  • 您需要在fullname = (TextInputLayout) findViewById(R.id.signup_fullname); 上放置一个断点,然后在调试器中运行,查看断点是否命中,以及该行是否正确找到视图。
  • activity_sign_up.xml发布你的布局文件。

标签: java android firebase database-design


【解决方案1】:

您尚未在 SignUp 活动中初始化任何 TextInputLayout 全名、用户名、电子邮件和密码。

【讨论】:

  • 我应该如何初始化它们?
  • fullname = findViewById(R.id.fullname); 一样初始化它们,其中 R.id.fullname 中的 fullname 是 XML 代码中 TextInputLayout 的 id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2021-06-09
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多