我试图解决一个问题,当用户按下后退键时,应该重新创建片段而不是从后台堆栈加载。我有一个带有框架布局的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();
}
}
任何人都可以帮我解决上述任何一个问题吗?
答案 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