【问题标题】:How to handle drag-to-select of sub-menu items on Kitkat?如何处理 Kitkat 上子菜单项的拖动选择?
【发布时间】:2014-06-18 06:01:39
【问题描述】:

背景

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

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

下面是 actionBar 上子菜单的外观:

代码

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

<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) 开始,用户可以在到达想要选择的项目时按住并离开,而不是点击项目。

该功能在“Drag-to-Select”下显示为here。大多数人不知道这个功能,但人们已经报告了一个非常烦人的错误。

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

没错,它被屏蔽,直到你选择别的东西。

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

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

问题

为什么会这样?

我的代码有什么问题吗?

这是一个错误吗?

我该如何解决?

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

【问题讨论】:

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


    【解决方案1】:

    这是一个错误吗?

    我也可以重新创建它。我检查了AOSP's issue tracker 并没有找到任何东西,但它确实似乎是一个错误。

    为什么会这样?

    我认为它与ListPopupWindow.ForwardingListener 有关,但我不确定现在问题究竟出在哪里。

    我该如何解决?

    选择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;
    }
    

    限制

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

    【讨论】:

    • 这行得通,但现在我还必须重新更新操作项以匹配当前状态。想知道有没有别的办法。无论如何,谢谢。顺便说一句,我在这里发布了一个错误报告:code.google.com/p/android/issues/detail?id=69205
    • 我认为这也应该适用于任何类型的操作项,因为其中一些可能位于溢出操作项菜单中。
    • 遗憾的是,此解决方案仅适用于不在溢出操作项上的操作项。对于那些在溢出操作项上的,第二个问题(谷歌的应用程序)出现了。你知道如何解决这个问题吗?
    • @androiddeveloper 不幸的是,如果我们认为这是一个错误是正确的,我认为我们是正确的,我认为目前没有更好的解决方法。即使通过反射,也无法修改 ActionMenuPresenter 的行为。
    • 好的,如果你编辑它,我会勾选你的答案,这样人们就会知道这只适用于我写的案例。我真的希望谷歌能解决这个问题,即使它是小问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多