如何为导航抽屉项目添加长按功能?

Mik*_*i P 5 java navigation android menuitem

正如标题所示,我正在尝试向应用程序导航抽屉中的项目添加长按功能。这些项目是动态添加的(不是从 navigation_drawer_menu.xml 膨胀的),因此我无法通过在 xml 文件中指定某些属性来解决这个问题。

我查看了 Stackoverflow 上的几个问题,特别是这个问题:How to set a long click Listener on a MenuItem (on a NavigationView)? 。我已经实现了 setActionView 解决方案,但最终在导航抽屉项的右侧边缘出现了一个空白按钮。当我长按文本时,没有任何反应。当我长按空白小按钮时,我得到了我想要的东西。

如何为整个 menuItem 设置 OnLongClickListener,而不仅仅是其右侧的(我假设它是一个按钮)?感谢您的阅读,如果需要更多信息,我很乐意为您提供帮助:)

Ika*_*Ika 1

我遇到了同样的问题,并通过深入研究 NavigationView 的视图层次结构来解决它。

第一步是了解 NavigationView 的视图层次结构。您可以使用本文中的代码片段打印出 NavigationView 的视图层次结构。

然后开始挖掘您要定位的视图。就我而言:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    // Start digging into the view hierarchy until the correct view is found
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    ViewGroup navigationMenuView = (ViewGroup)navigationView.getChildAt(0);
    ViewGroup navigationMenuItemView = (ViewGroup)navigationMenuView.getChildAt(2);
    View appCompatCheckedTextView = navigationMenuItemView.getChildAt(0);

    // Attach click listener
    appCompatCheckedTextView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            Log.i("test", "LONG CLICK");
            return true;
        }
    });

    return super.onPrepareOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)