java - 使用 Firebase for Android 时出现片段错误
问题描述
我正在为我的 android 应用程序创建一个底部导航。我让用户使用 Firebase 登录并进入第一个屏幕(主页片段)。此片段读取 JSON 文件并显示可以正常工作的信息。
问题:当您单击切换到配置文件片段时,应用程序崩溃并给出致命错误,我不知道如何解决这个问题。我对 Android 比较陌生,我尝试了许多不同的“解决方案”,但都没有成功。以下是我的片段和主要活动。
MainActivity.java
public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadFragment(new HomeFragment());
//getting bottom navigation view and attaching the listener
BottomNavigationView navigation = findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(this);
}
private boolean loadFragment(Fragment fragment) {
//switching fragment
if (fragment != null) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
return true;
}
return false;
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Fragment fragment = null;
switch (item.getItemId()) {
case R.id.navigation_home:
fragment = new HomeFragment();
break;
case R.id.navigation_dashboard:
fragment = new DashboardFragment();
break;
case R.id.navigation_profile:
fragment = new ProfileFragment();
break;
}
return loadFragment(fragment);
}
}
HomeFragment.java
public class HomeFragment extends Fragment {
RecyclerView recyclerView;
List<Articles> articles;
View rootView;
private static String JSON_URL = "https://www.britbound.com/json/articles.json";
Adapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_home, container, false);
recyclerView = rootView.findViewById((R.id.recView_articles));
articles = new ArrayList<>();
extractArticles();
return rootView;
}
private void extractArticles(){
RequestQueue queue = Volley.newRequestQueue(getContext());
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Request.Method.GET,
JSON_URL,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try{
JSONArray array = response.getJSONArray("articles");
for(int i=0;i<array.length();i++){
Articles article = new Articles();
JSONObject articleObj = array.getJSONObject(i);
article.setTitle(articleObj.getString("title").toString());
article.setPublishDate("Published: "+articleObj.getString("date_published").toString());
article.setExcerpt(articleObj.getString("excerpt").toString());
article.setThumbnail(articleObj.getString("thumbnail").toString());
articles.add(article);
}
}catch (JSONException e){
e.printStackTrace();
}
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
adapter = new Adapter(getContext(), articles);
recyclerView.setAdapter(adapter);
}
},
new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error){
// Do something when error occurred
Log.d("tag", "onErrorResponse: " + error.getMessage());
}
}
);
// Add JsonObjectRequest to the RequestQueue
queue.add(jsonObjectRequest);
}
}
ProfileFragment.java
public class ProfileFragment extends Fragment {
TextView fullname, email,phone, verifyMsg;
FirebaseAuth fAuth;
FirebaseFirestore fStore;
String userId;
Button resendCode;
View rootView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_profile, container, false);
phone = rootView.findViewById(R.id.txt_userphonenumber);
fullname = rootView.findViewById(R.id.txt_userfullname);
email = rootView.findViewById(R.id.txt_useremail);
verifyMsg = rootView.findViewById(R.id.txt_emailnotverified);
fAuth = FirebaseAuth.getInstance();
fStore = FirebaseFirestore.getInstance();
resendCode = rootView.findViewById(R.id.btn_verifyemail);
userId = fAuth.getCurrentUser().getUid();
final FirebaseUser user = fAuth.getCurrentUser();
if(!user.isEmailVerified()){
resendCode.setVisibility(View.VISIBLE);
verifyMsg.setVisibility(View.VISIBLE);
resendCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
user.sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(getActivity(), "Verification email has been sent", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
private static final String TAG = "";
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "onFailure: Email not sent " + e.getMessage());
}
});
}
});
}
DocumentReference documentReference = fStore.collection("users").document(userId);
ListenerRegistration registration = documentReference.addSnapshotListener(getActivity(), new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
phone.setText(documentSnapshot.getString("phone"));
fullname.setText(documentSnapshot.getString("fullname"));
email.setText(documentSnapshot.getString("email"));
}
});
return rootView;
}
}
错误
--------- beginning of crash
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.britbound.britboundsocial, PID: 6457
java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1776)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1841)
at androidx.fragment.app.FragmentManager.executePendingTransactions(FragmentManager.java:489)
at com.google.firebase.firestore.core.ActivityScope.lambda$onFragmentActivityStopCallOnce$1(com.google.firebase:firebase-firestore@@21.4.0:180)
at com.google.firebase.firestore.core.ActivityScope$$Lambda$2.run(Unknown Source:4)
at android.app.Activity.runOnUiThread(Activity.java:6282)
at com.google.firebase.firestore.core.ActivityScope.onFragmentActivityStopCallOnce(com.google.firebase:firebase-firestore@@21.4.0:164)
at com.google.firebase.firestore.core.ActivityScope.bind(com.google.firebase:firebase-firestore@@21.4.0:192)
at com.google.firebase.firestore.DocumentReference.addSnapshotListenerInternal(com.google.firebase:firebase-firestore@@21.4.0:514)
at com.google.firebase.firestore.DocumentReference.addSnapshotListener(com.google.firebase:firebase-firestore@@21.4.0:456)
at com.google.firebase.firestore.DocumentReference.addSnapshotListener(com.google.firebase:firebase-firestore@@21.4.0:397)
at com.britbound.britboundsocial.fragments.ProfileFragment.onCreateView(ProfileFragment.java:74)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:310)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2167)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1990)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1945)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
I
任何帮助,将不胜感激。谢谢!
解决方案
推荐阅读
- flutter - 在 Flutter 中,如何通过文档 ID 访问 Google Docs 文档?
- php - 如何将类添加到 wp 自定义导航
- 和元素
- delphi - 为什么两个不同的 TColor 值对应相同的显示颜色?
- excel - 将数据从一张表复制到标题匹配的另一张表
- python - Django Form:逗号分隔的十进制数字引发验证错误
- laravel - 收到错误消息:“目标类 [App\Http\Controllers\paymentController] 在服务器上托管后不存在
- python - 如何将列表转换为 numpy 数组?
- haskell - 在 Haskell 中分配值
- r - 绘制变量的第一个、第二个和第三个值的图形
- react-native - 使用钩子处理本机反应中的动态复选框