为什么setOnClickListener被调用两次?

时间:2014-01-26 09:07:55

标签: java android

此代码是从我的活动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)无法返回布尔来停止传播?

更奇怪的是这个代码被调用了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;
        }
    });

2 个答案:

答案 0 :(得分:0)

在触摸设备上,您需要将其设置为离开(因为您按下按钮并且当您从按钮上按住手指时实际点击它)

答案 1 :(得分:0)

  1. 如果你的xml中没有android:onClick,onClick只会被调用一次。

  2. 由于onTouch的工作方式,所以至少三次被调用: 它可用于跟踪触摸移动 - 它会持续报告触摸位置以及当前操作 - ACTION_DOWNACTION_MOVEACTION_UP。这就是为什么你看到它被召唤三次的原因。如果您选中event.getAction(),您会看到上面的三个操作都会出现一次。

    要避免此行为,请检查操作。通常,您需要确保它是ACTION_UP

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