在BackKey按下时重新创建碎片

时间:2014-08-05 23:15:37

标签: android android-fragments xamarin xamarin-studio

我试图解决一个问题,当用户按下后退键时,应该重新创建片段而不是从后台堆栈加载。我有一个带有框架布局的Main活动,我动态地替换单帧内的碎片。当用户从片段中的片段开始时,下面的代码可以正常工作。但是当用户从导航抽屉中选择时,被替换的片段将进入后台堆栈的顶部,这会导致问题。

现在我在BackKey Pressed Event中编写的代码

public override void OnBackPressed()
        {

            Android.Support.V4.App.FragmentManager.IBackStackEntry entry =
                SupportFragmentManager.GetBackStackEntryAt(SupportFragmentManager.BackStackEntryCount - 1);

            string str = entry.Name;                   

            if (SupportFragmentManager.BackStackEntryCount == 0)
            {
                this.Finish();
            }                
            else
            {
                Fragment fr = (Fragment)MagicallyCreateInstance(str);
                SupportFragmentManager.BeginTransaction().Replace(Resource.Id.content_frame, fr).Commit();   
                SupportFragmentManager.PopBackStack();

            }                    
            base.OnBackPressed();
        }

我还有一个替换片段方法,我用它来替换片段。但是在这个过程中,默认情况下会以某种方式禁用后退键(不确定如何),但只要backstack中存在片段,旧的UI就会被加载。我可以在这里刷新布局吗?

public void ReplaceFragment(Fragment fragment, FragmentManager fragmentManager)
        {
            string backStateName = fragment.Class.SimpleName;
            bool fragmentPopped = fragmentManager.PopBackStackImmediate(backStateName, 0);

            if (!fragmentPopped && fragmentManager.FindFragmentByTag(backStateName) == null)
            {
                fragmentManager.BeginTransaction()
                               .Replace(Resource.Id.content_frame, fragment).SetTransitionStyle(FragmentTransaction.TransitFragmentFade)
                               .AddToBackStack(backStateName)
                               .Commit();
            }

        }

任何人都可以帮我解决上述任何一个问题吗?

1 个答案:

答案 0 :(得分:0)

我希望我能正确理解你的问题。但听起来你想要确保当用户从主导航中选择目的地时,你要确保清除或重置后堆栈。

例如:

Stack looks like this:
A->B->C
User selects D from main navigation, stack should look like:
D

NOT
A->B->C->D

如果是这种情况,您应该在导航到任何顶级目的地之前清除后台堆栈。这可以这样做:

FragmentManager.PopBackStack(null, FragmentManager.PopBackStackInclusive);

此方法的文档不是很好,但它会将所有内容从后台堆栈中弹出。可以在此处找到讨论:https://groups.google.com/d/msg/android-developers/0qXCA9rW7EI/M9riRM0kl9QJ