【问题标题】:Android Studio, Activity Switching question [duplicate]Android Studio,活动切换问题[重复]
【发布时间】:2019-05-15 02:03:18
【问题描述】:

我一直在尝试在 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;

    }

【问题讨论】:

    标签: java android firebase


    【解决方案1】:

    在您的 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,如果用户是!= null,它将再次检查onCreate() 内部。

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

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

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

    你可以在你的MainActivity中的那个if语句处下debug断点来查看用户的变化,然后你就可以确定用户是否为null

    提示

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

    private Button Login;
    

    这样做

    private Button mBtnLogin;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-13
      • 2011-07-05
      • 2016-03-08
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多