EditText OnClickListener 需要两次点击才能工作

Bre*_*uro 7 java android android-edittext

EditTexts我的活动中有 4 个。每个都有一个OnClickListener,当被调用时会为我选中一个复选框。但是,当我第一次按下 时EditTextEditText变为蓝色,但复选框未选中。只有当我再次按下它时OnClickListener才会生效并选中该框。

有人知道为什么是这样吗?

示例代码:

public View.OnClickListener respiratoryOnClickListenerv(final View v) {
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CheckBox respiratoryCheckbox = (CheckBox) v.findViewById(R.id.vitals_2);
            respiratoryCheckbox.setChecked(true);
            respiratoryCheckbox.callOnClick();
        }
    };
    return listener;
}


respiratoryEditText.setOnClickListener(respiratoryOnClickListenerv(rootView));
Run Code Online (Sandbox Code Playgroud)

小智 7

当用户与 UI 元素交互时,会按自上而下的顺序调用各种侦听器。(例如:OnTouch -> OnFocusChange -> OnClick。)如果已定义侦听器(使用 setOn...Listener)并且它使用此事件:将不会调用较低优先级的侦听器。就其性质而言,当您第一次触摸 EditText 时,它会通过 OnFocusChangeListener 获得焦点,以便用户可以键入。此处消耗该操作,因此不会调用 OnClick。每次连续触摸都不会改变焦点,因此事件会向下传递到 OnClickListener。

从中,您有三个选择:

1) 在 XML 中将 focusable 属性设置为 false:

机器人:焦点=“假”

现在 OnClickListener 将在每次点击时触发。但这使得 EditText 无用,因为用户不能再输入文本。

2) 实现 OnFocusChangeListener 和 OnClickListener:

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
             //Do your work
        }

    }
});
Run Code Online (Sandbox Code Playgroud)

您可以一起捕获 EditText 上的每个触摸事件。

3)自己实现一个OnTouchListener:

editText.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(MotionEvent.ACTION_UP == event.getAction())
                    Toast.makeText(getApplicationContext(), "onTouch: Up", Toast.LENGTH_SHORT).show();
                return false;
            }

    });
Run Code Online (Sandbox Code Playgroud)

这将在每次触摸 EditText 时执行。请注意,此事件返回一个布尔值。返回 false 意味着事件将继续向下传递并到达内置的 onFocusChangeListener 允许它接收文本。

希望这有帮助!