我有一个活动A,它调用片段Bf,它调用片段Cf. 我希望在调用Cf时将Bf放在backstack中,以便用户可以导航回它.但是,如果在Cf中按下特定按钮,我希望将Bf从后台堆叠中移除.这可能吗?
我看到有一个popBackStack()函数.但是,我对这将如何工作有点困惑.使用此功能是否安全?在Backstack上Bf之后是否有可能插入来自不同应用程序的活动?
另外,有没有办法改变backstack上片段的savedInstanceState?
我只是无法弄清楚如何使用模拟器在backstack上进行强大的测试.
我现在有一个包含片段的活动
[1],[2],[3],[4]
如果按下按钮[3],可以将其重定向到[4]
我想实现后退按钮如下图所示..
当按下[4]时,返回[3]
当按下[3]时,返回[2]
当按下[1]时,活动结束();
当涉及到当前的实现时,它完成活动而不是弹出Fragment.你能告诉我我应该做什么或记住什么?
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if( keyCode==KeyEvent.KEYCODE_BACK) 
    {   
        finish();
    }       
        return super.onKeyDown(keyCode, event); 
}   

我知道之前已经问过这个问题,但是到目前为止我已经得到了以前的答案.方案如下:我们有一个仪表板片段(A),它将用户引导到登录屏幕(B).成功登录后,他们会转到列表视图(c).在背压上我想返回A,因为用户不需要再次看到登录屏幕.此外,在成功登录后,我们将详细信息存储在共享首选项中,并在下次自动登录B,这些都按计划运行.
我有以下FragmentHelper方法:
public static void goToNextFragement(Fragment fragment, int container, boolean addToBackStack, Fragment ctx)
    {
        // Create new fragment and transaction
        FragmentTransaction transaction = ctx.getSupportFragmentManager().beginTransaction();
        transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(container, fragment);
        if(addToBackStack)
            transaction.addToBackStack(null);
        // Commit the transaction
        transaction.commit();
    }
在从B到CI的事务中,将布尔addToBackStack设置为false,以便transaction.addToBackStack(null);不调用它.这再次运作良好,但之后我的问题开始了.
当用户按下C并返回AI时,仍然可以在A的视图下看到C的膨胀视图.
任何帮助,将不胜感激.我希望我的图表有助于保持这一点.
我想要实现的场景:
我的代码:
        protected override void OnCreate(Bundle savedInstanceState)
        {
...
            var listFrag = new ListFragment();
            var infoFrag = new InfoFragment();
            var trans = FragmentManager.BeginTransaction();
            trans.Add(Resource.Id.listFrame, listFrag);
            trans.Add(Resource.Id.detailsFrame, infoFrag);
            trans.Commit();
...
        }
        public void OnItemSelected(int id)
        {
            var detailsFrag = DetailFragment.NewInstance(id);
            var trans = FragmentManager.BeginTransaction();
            trans.Replace(Resource.Id.detailsFrame, detailsFrag);
            if (FragmentManager.BackStackEntryCount == 0)
                {
                    trans.AddToBackStack(null);
                }
            trans.Commit();
        }
我的问题:
在按下后退按钮后,infoFrag与之前的detailFrag重叠!为什么?
我制作片段更换器助手类,我有一些问题.
我叫它 FragmentChanger
它有一个fragmentContainer,它是一个ViewGroup,包含我想要显示的所有片段.
我做了我自己的 replace(Fragment fragmentToChange, boolean needSaveToBackStack) 
功能是:
needSaveToBackStack为true或false.错误如下:
如果我使用我的替换功能保存到backStack它工作正常,我可以使用我的设备的后退按钮踩回到预先添加的片段它像魅力一样工作.
但是当我想用OUT保存到backStack 替换片段时,我的代码中有一些错误,因为当我退后时,我可以在屏幕上看到我没有添加到backStack的片段,而且我还可以看到其他同时添加了片段!
所以我可以在同一时间看到2个片段,如下所示:

这是我的代码:
//It is my helper class to handle replacing fragments.
public class FragmentChanger {
// fragmentTransaction
FragmentTransaction fragmentTransaction;
// the container for fragments
ViewGroup fragmentContainer;
// activity ofc
Activity act;
// Ctr: adding a default fragment to be the first so we can see it at app …是否有可能检查是否Fragment从后台恢复?例如,如果我有一个,然后由另一个替换,然后通过点击"返回"android按钮返回到上一个?
我正在使用ViewPager并FragmentStatePagerAdapter显示片段.最初有2个片段添加了Fragment1和Fragment2,第3个片段Fragment3在收到服务器的响应后在第2个位置添加.因此,在添加所有页面之后,这应该是ViewPager中的片段序列 - > Fragment1,Fragment3,Fragment2.
问题是在添加了Fragment1和Fragment3之后,如果我在第二个位置添加第三个片段,应用程序正在进行服务器调用,如果我多次进行屏幕旋转,那么在添加第三个片段之后它仍然显示最初在第二个位置处于第二个位置的Fragment2的旧副本位置和第三位置有Fragment2的新副本.所以Fragment3 doest出现在ViewPager中.添加第3片段后的序列 - > Fragment1,Fragment2的旧拷贝,New Fragment2.
我重写onSaveInstanceState,并呼吁super.onSaveInstanceState在我的活动.
我也试过回来POSITION_NONE了getItemPosition.我在某处读到ViewPager保存片段的副本.还可以通过调试我检查了ViewPager包含Fragment2 2份时问题重现,即使getItem的FragmentStatePagerAdapter每个位置返回不同的片段,但仍处于第2位有人出老片段.出于测试目的,getItem我返回Fragment1中的所有位置,以便所有3个页面应该相同,但即使在第二个位置之后,当我再现上述步骤的问题时,它显示了Fragment2的旧副本.
所以如何清除ViewPager它不会保存旧碎片.如何刷新ViewPager,以便它不会保留带有片段的旧副本.我认为问题在于onSaveInstanceState但我需要它.如何ViewPager在保存视图时排除onSaveInstanceState.我尝试过,mViewPager.setSaveEnabled(false)但需要太多记忆.
我发现问题是instantiateItem适配器的方法没有调用getItem,因为返回了旧的片段.
以下是解决方案代码
码:
 @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Object obj = super.instantiateItem(container, position);
            Fragment fragment = mFragments.get(position);
            if((obj!=null && fragment!=null) && !(obj.getClass().getSimpleName().equals(fragment.clss.getSimpleName()))){
                destroyItem(container, position, obj);
                return super.instantiateItem(container, position);
            }else{
                return obj;
            }
        }