C# 后堆栈上的同步导航抽屉菜单

C# 后堆栈上的同步导航抽屉菜单,c#,android,xamarin,xamarin.android,navigation-drawer,C#,Android,Xamarin,Xamarin.android,Navigation Drawer,我遵循了这个示例,并且我能够成功地使用带有片段的抽屉布局(带有视图寻呼机的嵌套片段)。我有一个问题,当我点击后退按钮时,左侧的导航抽屉菜单项没有与显示的片段同步 这就是我导航到其他片段的方式 SupportFragmentManager.BeginTransaction().Replace(Resource.Id.content, fragment).AddToBackStack(fragment.Name).Commit(); 我尝试了片段方法,但它没有在后堆栈中调用。我还尝试了Suppo

我遵循了这个示例,并且我能够成功地使用带有片段的抽屉布局(带有视图寻呼机的嵌套片段)。我有一个问题,当我点击后退按钮时,左侧的导航抽屉菜单项没有与显示的片段同步

这就是我导航到其他片段的方式

 SupportFragmentManager.BeginTransaction().Replace(Resource.Id.content, fragment).AddToBackStack(fragment.Name).Commit();

我尝试了片段方法,但它没有在后堆栈中调用。我还尝试了SupportFragmentManager BackbackChanged方法,但无法获取视图中的当前片段以更新导航抽屉菜单标题。

我也遇到了同样的问题,也找不到任何解决方案。虽然这个问题有点老了,但我的解决方案可能会对某些人有所帮助。我不确定这是否是最好的解决方案,但它对我有效

因此,首先需要将变量添加到先前选中项的存储ID中:

private int previousItemChecked;
if (savedInstanceState == null) {
    selectItem(0);
    previousItemChecked = 0;
}
最初将其设置为默认选中项:

private int previousItemChecked;
if (savedInstanceState == null) {
    selectItem(0);
    previousItemChecked = 0;
}
然后编辑片段事务,使backstack中的事务标题包含转换为字符串的先前选中项目的位置,并在事务完成后将变量previousItemChecked设置为当前选中的项目id:

fragmentManager.beginTransaction().replace(R.id.content_frame, selectedFragment).addToBackStack(""+previousItemChecked).commit();
previousItemChecked = mDrawerList.getCheckedItemPosition();
最后,在方法onBackPressed中,您需要获取之前分配给片段事务的字符串,将其解析为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,但如果您更新代码,它也应该可以使用。这里重要的是如何做到这一点。我希望答案是可以理解的,并能帮助他人。

我遇到了同样的问题,我这样解决了:

NavController navController.addOnDestinationChangedListener(this);
在selectItem中,我们传递位置项; 因此,如果位置为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();
    }
}

通过将
DestinationChangedListener
注入
NavController
实现此目的,如下所示:

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());
    }
}