首页 > 解决方案 > Android Studio,活动切换问题

问题描述

我一直在尝试在 Android Studio 中创建此登录/注册应用程序,但遇到了问题。当我进入注册活动时,我无法通过单击设置 OnClickListener 的 TextView 返回登录活动。此外,当我按下注册活动上的注册按钮时,它应该带我回到登录/主活动,但它没有。下面我有两个 Activity 和清单的代码。有人能告诉我我的错误在哪里吗?

显现

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.cedricpaige.mercurylogin">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MainActivity" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".SecondActivity" />
    <activity android:name=".RegActivity"></activity>
</application>

</manifest>

主要活动

public class MainActivity extends AppCompatActivity {


private EditText Name;
private EditText Password;
private TextView Info;
private Button Login;
private int counter = 5;
private TextView userReg;
private FirebaseAuth firebaseAuth;
private ProgressDialog progressDialog;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Name = (EditText) findViewById(R.id.nameText);
    Password = (EditText) findViewById(R.id.passText);
    Info = (TextView) findViewById(R.id.textView);
    userReg = (TextView) findViewById(R.id.tvReg);
    Login = (Button) findViewById(R.id.loginButton);

    Info.setText("No. of attempts remaining: 5");


    firebaseAuth = FirebaseAuth.getInstance();
    progressDialog = new ProgressDialog(this);

    FirebaseUser user = firebaseAuth.getCurrentUser();

    if (user != null) {
        finish();
        startActivity(new Intent(MainActivity.this, RegActivity.class));
    }


    Login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            validate(Name.getText().toString(), Password.getText().toString());
        }
    });

    userReg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(MainActivity.this, RegActivity.class));
        }
    });

}


private void validate(String userName, String userPassword) {

    progressDialog.setMessage("Signing In!");
    progressDialog.show();

    firebaseAuth.signInWithEmailAndPassword(userName, userPassword).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()) {
                progressDialog.dismiss();
                Toast.makeText(MainActivity.this, "Login Successful!", Toast.LENGTH_SHORT).show();

                startActivity(new Intent(MainActivity.this, SecondActivity.class));

            }else {
                Toast.makeText(MainActivity.this, "Login Failed!", Toast.LENGTH_SHORT).show();
                counter--;
                Info.setText("Number of attempts remaining: " + counter);
                progressDialog.dismiss();
                if (counter == 0) {
                    Login.setEnabled(false);
                }

            }
        }
    });

}

}

注册活动

public class RegActivity extends AppCompatActivity {

private EditText userName, userPassword, userEmail;
private Button regButton;
private TextView userLogin;
private FirebaseAuth firebaseAuth;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reg);
    setupUIViews();


    firebaseAuth = FirebaseAuth.getInstance();


    regButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (validate()) {


                String user_email = userEmail.getText().toString().trim();
                String pass_word = userPassword.getText().toString().trim();

                firebaseAuth.createUserWithEmailAndPassword(user_email,pass_word).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {

                        if (task.isSuccessful()) {
                        Toast.makeText(RegActivity.this, "Registration Successful!", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(RegActivity.this, MainActivity.class));
                    }else {
                            Toast.makeText(RegActivity.this, "Registration Failed!", Toast.LENGTH_SHORT).show();

                        }
                        }
                });

            }
        }
    });


    userLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(RegActivity.this, MainActivity.class));
        }
    });

}
    private void setupUIViews() {

    userName = (EditText)findViewById(R.id.etUserName);
    userPassword = (EditText)findViewById(R.id.etPassword);
    userEmail = (EditText)findViewById(R.id.etEmail);
    regButton = (Button)findViewById(R.id.buttonSignUp);
    userLogin = (TextView)findViewById(R.id.textviewAlready);

    }

    private Boolean validate() {
        Boolean result = false;

        String name = userName.getText().toString();
        String password = userPassword.getText().toString();
        String email = userEmail.getText().toString();

        if (name.isEmpty() || password.isEmpty() || email.isEmpty()) {

            Toast.makeText(this,"Please enter all details", Toast.LENGTH_SHORT).show();

        }else {
            result = true;
        }

        return result;

    }

标签: javaandroidfirebase

解决方案


在您的 MainActivity 中,您的 onCreate() 中有这行代码

 if (user != null) {
        finish();
        startActivity(new Intent(MainActivity.this, RegActivity.class));
    }

这就像 authListener() 一样工作,当您的 Activity 启动时,它将查看用户是否 != null 进入该块。

当您在 RegisterActivity 中使用此代码时

 regButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (validate()) {


                String user_email = userEmail.getText().toString().trim();
                String pass_word = userPassword.getText().toString().trim();

                firebaseAuth.createUserWithEmailAndPassword(user_email,pass_word).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {

                        if (task.isSuccessful()) {
                        Toast.makeText(RegActivity.this, "Registration Successful!", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(RegActivity.this, MainActivity.class));
                    }else {
                            Toast.makeText(RegActivity.this, "Registration Failed!", Toast.LENGTH_SHORT).show();

                        }
                        }
                });

            }
        }
    });

if (task.isSuccessful()) {...再次启动 MainActivity 后,它将再次检查用户onCreate()是否为!= null.

由于您刚刚注册了一个用户,getCurrentUser() != null因此它会自动输入该 if 语句并完成您的MainActivity.class,然后重新启动您的RegisterActivity.class

一个简单的解决方案不是让用户回到登录活动(MainActivity.class),而是在他们登录后将您的用户发送到活动,因为现在用户是 !=null 您不需要请求登录再次给用户。

如果那不是您的用例,只需finish()从您的MainActivity意愿中删除即可完成这项工作,而不是在您的目标上做另一个意图RegisterActivity,只需在完成后完成task.isSuccefull

您可以在 MainActivity 中的 if 语句处放置一个调试断点以查看用户的更改,然后您可以确定该用户是否为空

小费

我看到您对变量使用大写名称,而不是这样做

private Button Login;

做这个

private Button mBtnLogin;

它不会改变您的代码中的任何内容,但定义您的变量CamelCase将降低您的应用程序开发未来将其与某些方法调用混淆的风险


推荐阅读