为什么我的DrawerLayout仍然在活动恢复时打开,尽管关闭它?

时间:2015-06-15 10:11:40

标签: android xamarin.android android-navigation

我有一个DrawerLayout,其中包含链接到其他活动的项目的ListView。 ListView的OnItemClick事件是每个菜单元素的开关大小写,它运行代码

...
case targetActivity:
    listViewInstance.ClearChoices();
    drawerInstance.CloseDrawer(MainMenuLayout);
    drawerInstance.RequestLayout();

    StartActivity(targetIntent);
    break;
...

这主要按预期工作,但如果我更改设备方向并且targetIntent返回到具有ClearTop标志的基本活动,则DrawerLayout仍然打开!尽管对CloseDrawer的调用非常明确,尽管事实上我可以看到它在新活动开始时关闭。我究竟做错了什么? (我正在使用Xamarin.Android,如果这是相关的)。

[编辑1:我怀疑CloseDrawer仅在关闭动画完成时将抽屉注册为关闭,并且在此之前基本活动暂停。如果我在另一个线程中调用CloseDrawer并在调用StartActivity之前暂停当前线程,抽屉将按预期工作,但当然这不是一个合适的解决方案。有没有人更清楚如何以干净的方式解决这个问题?]。

[编辑2:一种可能的解决方案linked here,就是为抽屉的OnDrawerClosed事件创建一个事件监听器:

public class DrawerListener2 : DrawerLayout.SimpleDrawerListener
    {
        public override void OnDrawerClosed(View view)
        {
            base.OnDrawerClosed(view);

            var listParent = (RelativeLayout)view;
            var listViewInstance = listParent.FindViewById<ListView>(Resource.Id.mainmenu);

            int selectedIndex = menuListView.CheckedItemPosition;

            switch (selectedIndex)
            {
                case 0:
                    // Start activity A
                    break;
                case 2: // Element 1 is a menu spacer
                    // Start activity B
                    break;
                case 3:
                    // Start activity C
                    break;
            }
        }
    }

...
// In base activity's OnResume:
drawerInstance.SetDrawerListener(new DrawerListener2());
...

这有两个问题让它变得禁止:我必须在switch-case中重新创建我的菜单项顺序,因为我无法在OnDrawerClosed处理程序中找到包含此信息的对象,而且我也可以' t从事件处理程序启动所需的活动,因为这些活动需要来自基本活动的意图信息。

1 个答案:

答案 0 :(得分:0)

半丑陋的黑客解决:

在基本活动中,创建将其值存储为Extra:

的属性
private bool ForceDrawerMenuCloseOnActivityResume
    {
        get { return Intent.GetBooleanExtra("ForceDrawerMenuCloseOnActivityResumeKey", false); }
        set { Intent.PutExtra("ForceDrawerMenuCloseOnActivityResumeKey", value); } 
    }

在基本活动的OnResume()中,如果设置了此属性,请重新关闭抽屉:

if (ForceDrawerMenuCloseOnActivityResume) { 
            drawerInstance.CloseDrawer(MainMenuLayout);
            ForceDrawerMenuCloseOnActivityResume = false;
        }

关闭抽屉时,在开始活动之前,导致抽屉在活动恢复时保持打开状态:

case targetActivity:
    drawerInstance.CloseDrawer(MainMenuLayout);
    listViewInstance.ClearChoices();
    ForceDrawerMenuCloseOnActivityResume = true;

    StartActivity(targetIntent);