java - 为什么 setOnClickListener 被调用两次?

标签 java android

此代码是从我的 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;
        }
    });

最佳答案

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

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

    要避免这种行为,只需检查操作即可。通常您需要确保它是 ACTION_UP:

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

关于java - 为什么 setOnClickListener 被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21361650/

相关文章:

java - Java 反射 getMethod 有时不起作用的原因是什么?

android - 有关 android.graphics.Camera 和 android.graphics.Matrix 的文档或教程?

android - 当 startActivityForResult 处于 Activity 状态时,如何处理后退按钮?

java - 检查字符串值是否是一组整数

java - 如何使用ant脚本运行maven项目?

java - 如何在 Java 8 Instant 中表示 MS-DTYP `DATETIME`?

java - 如何在netbean java中的jframe中存在的另一个面板中单击不同面板上的按钮时显示面板

android - getParentFragment() 在 ViewPager 中返回 null

android - 再次恢复应用程序时如何不重新加载webview?

java - API 级别 19 或更低级别的 LocalDate 替代方案?