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();
}