EditText的OnClickListener需要点击两次才能生效

8
我在我的活动中有4个EditText。每个EditText都有一个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));

你应该使用 focuschange {focus = true} 而不是 click{}。 - tiny sunlight
你能详细说明一下吗?我有点困惑。 - Brejuro
请查看OnFocusChangeListener() http://developer.android.com/reference/android/view/View.html#setOnFocusChangeListener(android.view.View.OnFocusChangeListener),EditText上的第一次点击将使视图获得焦点。 - novak
respiratoryEditText.setOnFocusChangeListener(new OnFocusChangeListener(){ onFoucsChange(View v, boolean focus){ if(focus){//do you logic}}})。 - tiny sunlight
1个回答

13
当用户与UI元素交互时,各种监听器按自上而下的顺序被调用。(例如:OnTouch - > OnFocusChange - > OnClick)。如果已定义了一个监听器(使用setOn...Listener)并且它消费了此事件:则不会调用较低优先级的监听器。第一次触摸EditText时,由于其特性,它会接收到OnFocusChangeListener以便用户可以输入。这里消耗了该操作因此OnClick不会被调用。每次连续的触摸都不会改变焦点,因此事件会向下传递给OnClickListener。
基于此,你有三个选择: 1)在XML中将focusable属性设置为false:
android: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,从而使其能够接收文本。

希望这有所帮助!


如果(hasFocus) {//做你的工作} 只会在焦点改变为!hasFocus之前起作用一次。 - Rahim Rahimov
@Brejuro所以请检查我的回答。https://dev59.com/jWcs5IYBdhLWcg3w0HIa#39841661 - Rahim Rahimov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接