此代码是从我的 Activity onCreate()
调用的:
private void setOnClickListeners() {
mLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onSignClicked();
}
});
mForgotYourText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onRemindClicked();
}
});
..
}
mLoginButton
是一个 LinearLayout,里面有一个 textView
mForgotYourText
是一个 TextView
在调试时,我发现 mLoginButton.setOnClickListener
分配被调用了两次。
而 mForgotYourText.setOnClickListener
是按预期仅调用一次的分配。
为什么会有差异?是因为 eventHandling 传播吗?
如果是这样 - 为什么 public void onClick(View v)
无法返回 boolean 值来停止传播?
更奇怪的是这段代码被调用了3次,
处理同一元素mLoginButton
:
mPhoneNumberField.setInputTextOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
setResult(RESULT_CANCELED);
finish();
return true;
}
});
最佳答案
如果您的 xml 中没有
android:onClick
,则 onClick 只会被调用一次。由于
onTouch
的工作方式,这至少被调用了三次: 它可用于跟踪触摸移动 - 它持续报告触摸位置以及当前操作 -ACTION_DOWN
、ACTION_MOVE
或ACTION_UP
。这就是为什么你会看到它被调用三次的原因。如果您检查event.getAction()
,您将看到上面的三个操作将各出现一次。要避免这种行为,只需检查操作即可。通常您需要确保它是
ACTION_UP
:if (Event.getAction() == MotionEvent.ACTION_UP) { ....
关于java - 为什么 setOnClickListener 被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21361650/