簡體   English   中英

為什么setOnClickListener被調用兩次?

[英]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;
        }
    });

在觸摸設備上,您需要將其設置為休假(因為按下按鈕時,當手指從按鈕上划開時它實際上已被單擊)

  1. 如果您的xml中沒有android:onClick ,則onClick只會被調用一次。

  2. 這就是所謂的至少三次,因為這樣onTouch工作原理:它可以用來追蹤觸摸動作-它不斷地與當前的行動一起報道了觸摸位置- ACTION_DOWNACTION_MOVEACTION_UP 這就是為什么您看到它被調用了三次的原因。 如果檢查event.getAction() ,您將看到上面的三個動作將分別出現一次。

    為了避免這種行為,只需檢查操作即可。 通常,您要確保它是ACTION_UP

     if (Event.getAction() == MotionEvent.ACTION_UP) { .... 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM