CircleButton LongClickListener未触发

时间:2015-04-14 15:19:21

标签: java android button onlongclicklistener

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

Lib: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,也没有任何作用。

1 个答案:

答案 0 :(得分:1)

我没有使用特定的库但是我读了代码并发现在onTouchEvent方法中,performClick()在MOTION_UP case块中被调用一次。这是触发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;
}