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

标签 android android-actionbar submenu android-4.4-kitkat

背景

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

如果您只需点击操作项,效果会非常好。

这是子菜单在操作栏上的样子:

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 ,在“拖动选择”下。大多数人不知道此功能,但人们已经报告了一个非常烦人的错误。

如果您尝试上面的代码(或我的应用程序)并使用此功能,您会发现您将无法再次单击相同的操作项,除非您先单击其他操作项。

没错,它会被阻止,直到您选择其他内容为止。

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

看看其他应用程序(甚至是 Google 的应用程序),我可以注意到类似的问题:尽管我找不到分组子菜单的确切示例,但对于常规子菜单,操作项会被阻止单次。再次点击它就会释放它。

问题

为什么会出现这种情况?

我的代码有什么问题吗?

这是一个错误吗?

如何修复它?

如果没有解决办法,我应该创建自己的弹出菜单,还是有其他解决方法?

最佳答案

Is this a bug?

我也可以重新创建它。我检查了AOSP's issue tracker并没有发现任何东西,但这肯定是一个错误。

Why does this occur?

我认为这与 ListPopupWindow.ForwardingListener 有关,但我现在不确定问题到底出在哪里。

How can I fix it?

选择 MenuItem 后调用 Activity.invalidateOptionsMenu

@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;
}

限制

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

关于android - 如何处理 Kitkat 上子菜单项的拖动选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23413116/

相关文章:

android - 无线局域网 : disagrees about version of symbol module_layout

javascript - 有什么方法可以通过 java native 模块(react native bridge)访问 Realm 实例(由 javascript 代码创建)?

java - 如何对包含已通过比较器排序的 ArrayList<HashMap<String, String>> 元素的 ArrayList<String> 进行排序?

mysql - Codeigniter 上使用数组和 MySQL 的动态菜单出现问题

CSS嵌套子菜单显示与父级相同的级别

java - 使用 C# Web 服务连接 Android 设备时出错

android - ActionBar 标题不可见

android - 操作栏不显示操作 View 图标

Android Toolbar actionLayout of Switch导致菜单按下时文本跳转

html - 如何指定子菜单div的位置并防止菜单div改变