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

时间:2015-12-07 01:56:41

标签: java android android-edittext

我的活动中有4 EditTexts。每个人都有一个OnClickListener,调用时会为我选中一个复选框。但是,当我第一次按下EditText时,EditText变为蓝色,但复选框不会检查。只有当我再次按下它时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));

1 个答案:

答案 0 :(得分:3)

当用户与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
        }

    }
});

您可以一起捕捉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;
            }

    });

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

希望这有帮助!