Android 如何修复FragmentManager已在FragmentTransaction中执行事务?
我在Android 如何修复FragmentManager已在FragmentTransaction中执行事务?,android,android-fragments,android-activity,google-cloud-firestore,Android,Android Fragments,Android Activity,Google Cloud Firestore,我在FragmentManager执行事务时遇到问题。我研究如何解决这个问题,但答案不是我代码中的答案。他们使用viewpager和fragment manager,但我使用fragment事务只是因为我使用的是底部导航栏 根本原因是来自主片段的快照侦听器。有人能帮我修一下吗?这是我的密码: MainActivity.java final Intent intent = getIntent(); final String UserID = intent.getStringExtr
FragmentManager执行事务时遇到问题。我研究如何解决这个问题,但答案不是我代码中的答案。他们使用viewpager和fragment manager,但我使用fragment事务只是因为我使用的是底部导航栏
根本原因是来自主片段的快照侦听器。有人能帮我修一下吗?这是我的密码:
MainActivity.java
final Intent intent = getIntent();
final String UserID = intent.getStringExtra("userid");
final HomeFragment fragment = new HomeFragment();
Bundle bundleh = new Bundle();
bundleh.putString("userid", UserID);
fragment.setArguments(bundleh);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commitNow();
这是错误指向的那条线
HomeFragment.java
db.collection("Baskets").document(uid).collection("Store_Baskets")
.addSnapshotListener(getActivity(), new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null){
Log.e(LOG_DB, e.toString());
}else {
List<String> ids = null;
for (DocumentSnapshot ds: queryDocumentSnapshots){
ids.add(ds.getId());
}
if (ids.size()==0){
basket_count.setText("0");
}else {
basket_count.setText(String.valueOf(ids.size()));
}
}
}
});
您应该将与db.collection相关的代码从HomeFragment的onCreate()
移动到onActivityCreated()
,并在片段中使用getChildFragmentManager()
:
FragmentTransaction fragmentTransaction =
fragment.getChildFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
另外,您应该使用fragmentTransaction.commit()代码>而不是fragmentTransaction.commitNow()代码>
从Javadoc:
使用commitNow()
提交的事务不能添加到
FragmentManager的后堆栈
事务只能在提交前使用commitNow()
提交
包含保存其状态的活动。如果尝试提交
在该点之后,将引发异常。这是因为
如果需要更改活动,则提交后的状态可能会丢失
从它的状态恢复
如果您正在使用firebase,并且正在侦听对文档的更改,如
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
//Doing work
}
});
我只是将其更改为commit()
,但我的应用程序仍然崩溃请发布崩溃的stacktrace什么是MPAGeraAdapter先生?我更新了我的问题并发布了stacktrace先生。请看一看。调用片段。getChildFragmentManager()在从另一个片段启动片段时也使用getChildFragmentManager()。是的,我正在这样做,但即使我使用了它,我仍然会收到错误。在getChildFragment()上,我无法使用它,因为它无法解析,但当我在getChildFragmentManager()之前添加该片段时,它会解析它,但我再次遇到一个arror,该片段尚未附加。您只应在另一个片段中调用getChildFragmentManager。您是否已将代码更改为使用ListenerRegistration?
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
//Doing work
}
});
ListenerRegistration registration = docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
}
});
@Override
public void onStop() {
super.onStop();
registration.remove();
}