我试图解决一个问题,当用户按下返回键时,应该重新创建片段,而不是从返回堆栈加载。我有一个单一的主活动与框架布局,我动态地替换单个框架内的片段。当用户从一个片段到另一个片段时,下面的代码可以工作。但是当用户从导航抽屉中选择时,被替换的片段会到backstack的顶部,这会导致问题。
现在我写的代码在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();
}
}
有谁能帮我解决这个问题吗?
我希望我正确理解了你的问题。但这听起来像是你想要确保当用户从你的主导航中选择一个目的地时,你想要确保后面的堆栈被清除或重置。
,
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