Android 调用片段B时,片段A不会暂停

Android 调用片段B时,片段A不会暂停,android,android-activity,android-fragments,fragment,Android,Android Activity,Android Fragments,Fragment,我有两个片段,我们将第一个片段称为片段A,第二个片段称为片段B片段A包含一个ViewPager,其中包含两个子片段,片段B是一个片段,它将以某种方式从用户处获取一些数据点。片段A的子片段之一包含一个回收视图,该视图应使用片段B中的数据点更新其cardview。这两个片段都在框架布局中替换 问题是,notifiyDatasetChanged从未为片段AsRecyclerView调用,因为片段A从未调用过。当我从片段B点击后退按钮时,它不会用新数据更新回收视图 当我打开Fragment B时,如何让

我有两个片段,我们将第一个片段称为
片段A
,第二个片段称为
片段B
<代码>片段A包含一个
ViewPager
,其中包含两个子片段,
片段B
是一个片段,它将以某种方式从用户处获取一些数据点。
片段A
的子片段之一包含一个
回收视图
,该视图应使用
片段B
中的数据点更新其cardview。这两个片段都在
框架布局中替换

问题是,
notifiyDatasetChanged
从未为
片段A
s
RecyclerView
调用,因为
片段A从未调用过。当我从
片段B
点击后退按钮时,它不会用新数据更新
回收视图

当我打开
Fragment B
时,如何让片段A暂停或调用
onStop
?更新回收视图的最佳方法是什么

片段A的交易

// ViewPager fragment
    fm = getSupportFragmentManager();
    ft = fm.beginTransaction();
    ft.replace(R.id.show_fragment, ViewPagerFragment.newInstance());
    ft.commit();
fm = getSupportFragmentManager();
            ft = fm.beginTransaction();
            ft.replace(R.id.show_fragment, SessionFragment.newInstance());
            ft.addToBackStack(null);
            ft.commit();
片段B的交易

// ViewPager fragment
    fm = getSupportFragmentManager();
    ft = fm.beginTransaction();
    ft.replace(R.id.show_fragment, ViewPagerFragment.newInstance());
    ft.commit();
fm = getSupportFragmentManager();
            ft = fm.beginTransaction();
            ft.replace(R.id.show_fragment, SessionFragment.newInstance());
            ft.addToBackStack(null);
            ft.commit();
反压时

 /*
When a fragment is open allow you to go back to the activity when back button is pressed
 */
@Override
public void onBackPressed() {

    FragmentManager fragmentManager = getSupportFragmentManager();

    if (onBackPressed(fragmentManager)) {
        return;
    } else {
        super.onBackPressed();
        button.setVisibility(View.VISIBLE);
        button.setEnabled(true);
    }

    super.onBackPressed();
}


private boolean onBackPressed(FragmentManager fm) {
    if (fm != null) {
        if (fm.getBackStackEntryCount() > 0) {
            fm.popBackStack();
            button.setVisibility(View.VISIBLE);
            button.setEnabled(true);
            return true;
        }

        List<Fragment> fragList = fm.getFragments();
        if (fragList != null && fragList.size() > 0) {
            for (Fragment frag : fragList) {
                if (frag == null) {
                    continue;
                }
                if (frag.isVisible()) {
                    if (onBackPressed(frag.getChildFragmentManager())) {
                        return true;
                    }
                }
            }
        }
    }

    return false;
}

声明堆栈对象

Stack<Fragment> fragmentStack = new Stack<Fragment>();
当必须将A替换为B时,请执行以下操作:

fm = getSupportFragmentManager();
ft = fm.beginTransaction();
fragmnetStack.lastElement().onPause();
mSessionFragment = SessionFragment.newInstance();
ft.replace(R.id.show_fragment, mSessionFragment );
fragmentStack.push(mSessionFragment );
ft.addToBackStack(null);
ft.commit();
在调用back按钮时,执行此操作以返回片段A

fragmentStack.lastElement().onPause();
fragmentStack.pop();
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
mViewPagerFragment = fragmentStack.lastElement();
mViewPagerFragment.onResume();
ft.replace(R.id.show_fragment, mViewPagerFragment);
ft.commit();
编辑:

在添加片段b之前,按如下方式删除片段A:

 fm = getSupportFragmentManager();
 ft = fm.beginTransaction();
 ft.remove(fragmentStack.pop());
 // then add the other code to add fragment B

在尝试从B->A移动时,您也必须执行相同的操作。在替换片段之前,您需要手动调用片段的onPause方法。您能给我看一些示例代码吗?这方面的最佳实践是什么?是的,你能做的就是,拿起一个堆栈,把第一个片段推到a。。当需要用B替换A时,在这种情况下,替换将新片段B推入堆栈,然后在此之前选择最后一个元素并调用onpause我认为替换它会暂停它,调用ft.replace(…)我认为如果使用相同的FrameLayout,则会暂停片段。你能在下面的回答中写出一些伪代码吗?如果它有效,我将接受你的回答嘿,你找到解决方案了吗。检查但不起作用错误是NoTouchElementException我想你必须先删除前面的片段,等等,检查编辑可能是我解释得不够清楚的错误。在片段a中的我的viewpager的第二个子片段中有一个recyclerview。在包含片段a和B的活动中,片段a最初启动,然后有一个按钮将片段B充气。替换,我的问题是片段B中获得的值没有正确存储在片段a的子recyclerview中。我检查了日志语句,由于一些奇怪的原因没有调用onResume??请在添加片段B之前尝试删除片段A,然后在向后移动时再次添加。。我相信它在您的旧代码中也可以工作。不幸的是,它仍然无法工作,下面是我的代码的外观: