【问题标题】:CircleButton LongClickListener not triggeredCircleButton LongClickListener 未触发
【发布时间】:2015-04-14 15:19:21
【问题描述】:

我使用来自 lib MaterialWidget 的 CircleButton。在我的片段中,我尝试在此组件上使用 LongClickListener,但它不起作用。 ClickListener 正在工作,但不是很长。

库:https://github.com/keithellis/MaterialWidget/blob/master/library/src/main/java/com/material/widget/CircleButton.java

它使用标准按钮。

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.fragment_home_home, container, false);

    rootView.findViewById(R.id.cb_startPhotoe).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isLongClickReleased) {
                Intent i = new Intent(getActivity(), NavigationActivity.class);
                i.putExtra("fake", 1);
                startActivity(i);
            }
        }
    });

    rootView.findViewById(R.id.cb_startPhotoe).setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            isLongClickReleased = false;
            displayMenu(rootView);
            return true;
        }
    });
    return rootView;
}

当我看到 lib 的代码时,我觉得没有什么特别的。 在调试模式下,不会触发侦听器 即使我评论 OnClickListener,也没有任何效果。

【问题讨论】:

    标签: java android button onlongclicklistener


    【解决方案1】:

    我没有使用特定的库,但我阅读了代码,发现在 onTouchEvent 方法中,performClick() 在 MOTION_UP 案例块中被调用一次。这就是触发您的 OnClickListener 的原因。因此,对于长按,您需要在该方法中插入适合您需要的performLongClick()

    这是我做长按的想法。这很简单,但您需要自定义 CircleButton 类。所以添加一个类变量说long tsDown;

    private long tsDown;
    
    @Override
    public boolean onTouchEvent(@NonNull MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                 ...
                 tsDown = System.currentTimeMillis();
                 break;
            case MotionEvent.ACTION_UP:
                ...
                if (!mMoveOutside) {
                    long tsUp = System.currentTimeMillis();
                    if (tsUp - tsDown < 1000){
                      // if press duration is below 1s                       
                      performClick();
                    }else{
                      performLongClick();
                    }  
                }
                break;
    
        }
        return true;
    }
    

    【讨论】:

    • 好的,谢谢,我错过了!如果我有 2 个事件来处理 2 个不同的操作怎么办?是否应该重新实现短/长点击行为?
    • 嗯,我大概知道如何合并这两种点击。我将编辑我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2021-02-26
    相关资源
    最近更新 更多