同步后退堆栈上的导航抽屉菜单
本文关键字:导航 菜单 堆栈 同步 | 更新日期: 2023-09-27 17:56:26
我遵循了 https://github.com/jamesmontemagno/Xam.NavDrawer 示例,我能够成功地使用带有片段的抽屉布局(实际上是带有视图寻呼机的嵌套片段)。我有一个问题,当我单击后退按钮时,左侧的导航抽屉菜单项未与显示的片段同步。
这就是我导航到其他片段的方式
SupportFragmentManager.BeginTransaction().Replace(Resource.Id.content, fragment).AddToBackStack(fragment.Name).Commit();
我尝试了OnAttachFragment方法,但它没有在反向堆栈上调用。我还尝试了SupportFragmentManager BackStackChanged方法,但我无法获取视图中的当前片段来更新导航抽屉菜单标题。
我遇到了同样的问题,也找不到任何解决方案。虽然这个问题有点老了,但我的解决方案可能会帮助某人。我不确定这是否是最好的解决方案,但它对我有用。
因此,首先您需要添加变量来存储先前检查的项目的ID:
private int previousItemChecked;
最初将其设置为默认选中的项目:
if (savedInstanceState == null) {
selectItem(0);
previousItemChecked = 0;
}
然后编辑片段事务,以便 backstack 中的事务标题包含先前选中的项目的位置转换为字符串,并在事务完成后将变量 previousItemCheck 设置为当前检查的项目 ID:
fragmentManager.beginTransaction().replace(R.id.content_frame, selectedFragment).addToBackStack(""+previousItemChecked).commit();
previousItemChecked = mDrawerList.getCheckedItemPosition();
最后在方法onBackPress中,您需要获取先前分配给片段事务的字符串,将其解析为int并根据获得的id更新抽屉:
@Override
public void onBackPressed() {
if(fragmentManager.getBackStackEntryCount() > 0) {
String title = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-1).getName();
int pos = Integer.parseInt(title);
previousItemChecked = pos;
mDrawerList.setItemChecked(pos, true);
}
super.onBackPressed();
}
我从我在Android Studio中创建的应用程序中提取了代码,因此它不适用于Xamarin,但是如果您更新代码,它也应该可以使用它。这里重要的是它是如何完成的。我希望答案是可以理解的,并且会帮助某人。
我遇到了同样的问题,我像这样解决了:
在选择项中,我们正在传递位置项;因此,如果位置为 0(或者我们希望它从菜单上的位置独立地显示为第一个),我们必须避免保存第一笔交易。所以。。。
private void selectItem(position){
//...
if (position != 0)
{
SupportFragmentManager.BeginTransaction()
.Replace(Resource.Id.content_frame, fragment)
.AddToBackStack(fragment.Name)
.Commit();
}
else
{
SupportFragmentManager.BeginTransaction()
.Replace(Resource.Id.content_frame, fragment)
.Commit();
}
}
设法通过在NavController
中注入DestinationChangedListener
来实现这一点,如下所示:
NavController navController.addOnDestinationChangedListener(this);
然后:
@Override
public void onDestinationChanged(@NonNull NavController controller,
@NonNull NavDestination destination,
@Nullable Bundle arguments) {
NavigationView navigationView = findViewById(R.id.nav_view);
if(navigationView != null){
navigationView.setCheckedItem(destination.getId());
}
}