java - 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;
}
解决方案
在您的 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
将降低您的应用程序开发未来将其与某些方法调用混淆的风险
推荐阅读
- mysql - SQL 约束检查 <>
- r - 如何从字符串中删除注册、商标和版权符号?
- reactjs - 如何将 spatie/laravel-permission 包与 react js 一起用于角色?
- javascript - 向创建的对象添加属性(Firebase 函数)
- php - 如何在 PHP7 中使用数组变量引用类方法?
- angular - Angular:如果可用,则渲染图像。否则渲染默认图像
- python - CPU 内存使用量随着使用 tf.data.Dataset 和 tf.py_function 加载的每个批次而增加
- reactjs - 使用 Axios 在 React 中搜索不同 URL 的最佳方法是什么?
- bash - Rename massively pdf with bash script using pdftotext (Debian)
- dialogflow-es - Dialogflow information/analytics retrieval and feed back to user