同步导航抽屉菜单和返回栈

4
我跟随https://github.com/jamesmontemagno/Xam.NavDrawer的示例,并且成功地使用了带有片段的抽屉布局(事实上是带有视图翻页器的嵌套片段)。 我有一个问题,当我点击返回按钮时,左侧的导航抽屉菜单项与显示的片段不同步。

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

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

我尝试了OnAttachFragment方法,但它在返回堆栈上不被调用。我也尝试了SupportFragmentManager BackStackChanged方法,但我无法获取当前在视图中的片段以更新导航抽屉菜单标题。
3个回答

2

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

首先,您需要添加变量以存储先前选中项目的ID:

private int previousItemChecked;

将其初始设置为您的默认选中项:

if (savedInstanceState == null) {
    selectItem(0);
    previousItemChecked = 0;
}

然后编辑片段事务,使回退堆栈中的事务标题包含先前选中项目的位置转换为字符串,并在事务完成后将变量previousItemChecked设置为当前选中的项目ID:

fragmentManager.beginTransaction().replace(R.id.content_frame, selectedFragment).addToBackStack(""+previousItemChecked).commit();
previousItemChecked = mDrawerList.getCheckedItemPosition();

最后,在onBackPressed方法中,您需要获取先前分配给片段事务的字符串,将其解析为整数,并根据获取的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

我曾经遇到过同样的问题,我是这样解决的:

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

0
成功实现这一点的方法是通过将一个 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());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接