java - 从用于 FirebaseAuth 的 onCompleteListener 开始一个片段?
问题描述
我正在尝试从另一个片段打开一个片段,但出现错误。
该应用程序在带有底部导航视图的主屏幕上打开。单击其中一个选项卡会打开一个片段,其中包含 Firebase 用户的登录屏幕。输入详细信息并按下登录按钮后,它应该验证用户并打开另一个片段。
一切正常,直到您按下登录。
下面是一个工作示例,其中两个片段实际上都是活动,并且一切正常。
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
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;
public class LoginActivity extends AppCompatActivity implements View.OnClickListener{
public Button btnLogIn;
private EditText inputEmail, inputPassword;
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAuth = FirebaseAuth.getInstance();
if (mAuth.getCurrentUser() != null) {
startActivity(new Intent(LoginActivity.this, SecondPage.class));
finish();
}
setContentView(R.layout.activity_login);
btnLogIn = findViewById(R.id.btn_login);
inputEmail = findViewById(R.id.email);
inputPassword = findViewById(R.id.password);
findViewById(R.id.btn_login).setOnClickListener(this);
mAuth = FirebaseAuth.getInstance();
}
@Override
public void onClick(View view){
final String email = inputEmail.getText().toString();
final String password = inputPassword.getText().toString();
if (TextUtils.isEmpty(email)) {
Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
return;
}
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>(){
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
if (password.length() < 6) {
inputPassword.setError(getString(R.string.minimum_password));
} else {
Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
}
} else {
Intent intent = new Intent(LoginActivity.this, SecondPage.class);
startActivity(intent);
finish();
}
}
});
}
}
现在这里是相同的代码,除了现在 LoginActivity 是一个片段并且需要打开另一个片段。这就是给我错误的原因。我已经更改了片段本身所需的内容。
package com.nikelspot.app;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
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;
public class LoginActivity extends Fragment implements View.OnClickListener {
public LoginActivity() {
//needed empty constructor
}
public Button btnLogIn;
private EditText inputEmail, inputPassword;
private FirebaseAuth mAuth;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
mAuth = FirebaseAuth.getInstance();
if (mAuth.getCurrentUser() != null) {
startActivity(new Intent(getActivity(), SecondPage.class));
}
View rootView = inflater.inflate(R.layout.frag_login,
container, false);
btnLogIn = rootView.findViewById(R.id.btn_login);
inputEmail = rootView.findViewById(R.id.email);
inputPassword = rootView.findViewById(R.id.password);
mAuth = FirebaseAuth.getInstance();
rootView.findViewById(R.id.btn_login).setOnClickListener(this);
mAuth = FirebaseAuth.getInstance();
return rootView;
}
@Override
public void onClick(View view){
final String email = inputEmail.getText().toString();
final String password = inputPassword.getText().toString();
if (TextUtils.isEmpty(email)) {
Toast.makeText(getActivity(), "Enter email address!", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(getActivity(), "Enter password!", Toast.LENGTH_SHORT).show();
return;
}
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>(){
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
// there was an error
if (password.length() < 6) {
inputPassword.setError(getString(R.string.minimum_password));
}
else {
Toast.makeText(getActivity(), getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
}
}
else {
Intent intent = new Intent(getActivity(), SecondPage.class);
startActivity(intent);
finish();
}
}
});
}
}
在 Android Studio 中,唯一错误的是下面的 finish() 方法以红色突出显示。错误消息说它无法解决。
else {
Intent intent = new Intent(getActivity(), SecondPage.class);
startActivity(intent);
finish();
}
我知道无法从片段中调用 finish() 方法,但是我在网上尝试了其他解决方案,但都没有奏效。这是我能得到的最接近的。
谢谢!
解决方案
您希望父活动打开片段。
您可以通过接口和回调来实现这一点。
在不完整的情况下,您使用启动第二个片段的方法启动对活动的回调。
阅读本文以获取更多信息:https ://gist.github.com/butelo/8729891
推荐阅读
- javascript - SQLite:计数函数返回[对象数据库](JS)
- c# - 在 C# 中的 Windows 服务中发出哔声
- amazon-web-services - AWS RDS - 我是否应该在现有集群中创建一个新集群 va 新数据库
- css - 重新调整图像网格的大小时,如何阻止这些间隙出现?
- xml - 使用 xslt1.0 根据输入动态构建 xml
- python - Pandas:更有效的嵌套 for 循环加上 if
- python - 我的线程每 10 秒运行一次,但有时该函数需要更长的时间才能运行。如何让计时器等到函数执行?
- mongodb - 以表格模式显示子字段的值
- c# - 从 c#(.NET) 向 Visual Fox Pro db 插入记录时抛出的功能不可用异常
- python - 如何为python中的每个数据生成单独的散点图?