我使用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;
}
当我看到库的代码时,对我来说没有什么特别的。
在调试模式下,不会触发侦听器
即使我评论了OnClickListener,也没有任何效果。
最佳答案
我没有使用特定的库,但是我阅读了代码,发现在onTouchEvent
方法中,在MOTION_UP case块中一次调用了performClick()
。这就是触发您的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;
}