如何处理Kitkat上的子菜单项的拖动选择?

时间:2014-05-01 17:34:21

标签: android android-actionbar submenu android-4.4-kitkat drag-to-select

背景

我有一个应用程序,在操作栏中有子菜单,用于选择排序类型。

如果您点击操作项,它的效果非常好。

这里是关于actionBar上子菜单的样子:

enter image description here

代码

为了便于理解我的所作所为,这里只是子菜单部分的简短版本:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.test.MainActivity" >

    <item
        android:icon="@drawable/ic_action_collections_sort_by_size_holo_dark"
        android:title="sorting"
        app:showAsAction="ifRoom">
        <menu >
            <group
                android:checkableBehavior="single"
                android:menuCategory="container" >
                <item
                    android:id="@+id/menuItem_sortByInstallTime"
                    android:title="by install time">
                </item>
                <item
                    android:id="@+id/menuItem_sortByUpdateTime"
                    android:title="by update time">
                </item>
                <item
                    android:id="@+id/menuItem_sortByAppName"
                    android:title="by app name">
                </item>
                <item
                    android:id="@+id/menuItem_sortByPackageName"
                    android:title="by package name">
                </item>
            </group>
        </menu>
    </item>

</menu>

问题

从Kitkat(Android 4.4)开始,用户可以保持触摸并在他们到达想要选择的项目时将其保留,而不是点击这些项目。

该功能显示为here,位于&#34; 拖动选择&#34;。大多数人都不知道这个功能,但人们已经报道了一个非常烦人的错误。

如果你试用上面的代码(或我的应用程序)并使用此功能,你会注意到你再也无法点击同一个动作项,除非你先点击其他动作。

没错,它会阻止直到你选择别的东西。

我已经在使用Kitkat的Nexus 4上测试了这个问题,并且可以确认。

查看其他应用(甚至谷歌的应用),我会发现类似的问题:即使我找不到具有分组子菜单的确切示例,但对于常规子菜单,动作项目被阻止一次。再次单击它将释放它。

问题

为什么会这样?

我的代码有什么问题吗?

这是一个错误吗?

我该如何解决?

如果没有修复,我应该创建自己的弹出菜单,还是有另一种解决方法?

1 个答案:

答案 0 :(得分:2)

  

这是一个错误吗?

我也可以重新创造它。我检查了AOSP's issue tracker并且没有找到任何内容,但它看起来似乎是一个错误。

  

为什么会这样?

我认为它与ListPopupWindow.ForwardingListener有关,但我现在还不确定问题的确切位置。

  

我该如何解决?

选择Activity.invalidateOptionsMenu后,请致电MenuItem

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menuItem_sortByInstallTime:
            // Do something
            break;
        case R.id.menuItem_sortByUpdateTime:
            // Do something
            break;
        case R.id.menuItem_sortByAppName:
            // Do something
            break;
        case R.id.menuItem_sortByPackageName:
            // Do something
            break;
        default:
            break;
    }
    invalidateOptionsMenu();
    return true;
}

<强>限制

不幸的是,看起来此解决方案仅适用于未放置在操作栏溢出菜单中的菜单项。如果您想关注此问题的进一步更新,请参阅AOSP问题跟踪器上的issue #69205