【问题标题】:Android theme not applied when calling openContextMenu调用 openContextMenu 时未应用 Android 主题
【发布时间】:2021-03-10 01:39:28
【问题描述】:

我有一个 recyclerview,我想在其中单击一下即可打开某些项目的上下文菜单。我通过调用openContextMenu()来做到这一点

viewHolder.itemView.setOnClickListener(v -> activity.openContextMenu(viewHolder.itemView));

我在bind 方法中使用setOnCreateContextMenuListener 为上下文菜单注册视图。

但是,上下文菜单上的样式与通过长按打开时不同:

长按版本似乎可以正确应用Theme.MaterialComponents 主题。使用View.showContextMenu() 产生与Activity.openContextMenu() 相同的结果。甚至View.performLongClick() 也是如此。主题正在以某种方式应用,因为当我将 android:itemBackground 等元素添加到主题时,它适用于菜单的两个版本。我还没有想出解释或修复,但如果/当我这样做时会在这里发布。

【问题讨论】:

  • 你是如何应用材料设计的,你是否覆盖了styles.xml上的android:listViewStyle?
  • 我将其应用于清单中的活动。我没有覆盖android:listViewStyle
  • 它们本身风格相同,短按或长按默认材质设计不变,material.io/components/lists
  • 理想情况下是这样。但是,这不是我正在经历的行为。

标签: android material-components-android android-contextmenu


【解决方案1】:

对话框缺少主题似乎确实是一个错误,但我现在对原因和解决方法有了更好的理解:

上下文菜单的材质版本旨在从用户单击视图的位置弹出。调用View.showContextMenu()Activity.openContextMenu()View.performLongClick() 的默认版本时,该信息不存在。使用View.performLongClick(float x, float y) 会传递信息,从而生成对话框的材质版本。不幸的是,该方法仅适用于 API 24 及更高版本。

一个(相当痛苦的)版本,其行为与较新版本的 Android 一样:

GestureDetectorCompat detector = new GestureDetectorCompat(fa, new ClickListener(viewHolder.itemView));
viewHolder.itemView.setOnTouchListener((v, event) -> detector.onTouchEvent(event));

使用手势监听器:

private static class ClickListener extends GestureDetector.SimpleOnGestureListener {
    public View view;

    public ClickListener(View view) {
        this.view = view;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent event) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return view.performLongClick(event.getX(), event.getY());
        }
        return view.performLongClick();
    }

    @Override
    public void onLongPress(MotionEvent event) {
        onSingleTapConfirmed(event);
    }
}

好像应该有更简单的方法,找到了就分享一下吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 2020-03-04
    • 1970-01-01
    • 2011-04-05
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多