[英]why is setOnClickListener called twice?
這段代碼是從我的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,其中帶有mLoginButton
mForgotYourText
是一個TextView
調試時,我看到mLoginButton.setOnClickListener
分配被調用了兩次。
而mForgotYourText.setOnClickListener
是分配,僅按預期調用一次。
為什么有區別? 是因為eventHandling傳播了嗎?
如果是這樣-為什么public void onClick(View v)
無法返回布爾值以停止傳播?
更奇怪的是,這段代碼被調用了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) { ....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.