在Back堆栈上同步导航抽屉菜单

时间:2014-04-02 16:58:28

标签: c# android xamarin xamarin.android android-navigation-drawer

我遵循https://github.com/jamesmontemagno/Xam.NavDrawer示例,我能够成功地使用带有片段的抽屉布局(带有视图寻呼机的实际嵌套片段)。我有一个问题,当我单击后退按钮时,左侧的导航抽屉菜单项不会与显示的片段同步。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

首先,您需要将变量添加到先前已检查项目的商店ID:

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中你需要获取先前分配给fragment事务的字符串,将其解析为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来说它不是,但如果您更新代码,它也应该使用它。这里重要的是它是如何完成的。我希望答案是可以理解的,并会帮助别人。

答案 1 :(得分:0)

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

在selectItem内部,我们传递位置Item; 因此,如果position为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();
    }
}

答案 2 :(得分:0)

设法通过向public static List<Obj> getTopTotals(List<Obj> data, int topCount) { return data.stream() .collect( Collectors.groupingBy(Obj::getName, TreeMap::new, Collectors.summingInt(Obj::getNum) )) // get TreeMap<String, Integer> of totals .entrySet().stream() .sorted((a, b) -> b.getValue().compareTo(a.getValue())) // sort by value desc .limit(topCount) .map(e -> new Obj(e.getKey(), e.getValue())) .collect(Collectors.toList()); } 注入DestinationChangedListener来实现这一点:

NavController

然后:

NavController navController.addOnDestinationChangedListener(this);