Android EditText点击两次才能响应,解决办法

本文介绍了一种在聊天应用中管理软键盘显示与隐藏的方法。通过使用EditText的onTouch事件而非onClick事件,可以更有效地控制软键盘的收起,从而改善用户体验。

原文:http://blog.163.com/benben_long/blog/static/199458243201501902450994/

我在写聊天输入框时,当点击表情,语音等按钮时,需要将软键盘隐藏掉,于是我就给Edittext设置了点击事件(onClick),开始感觉还行,但是有时点击事件没有响应,需要再次点击才有效果,于是就在网上查了一下改用监听onTouch事件。

如当焦点在别的控件上时,只能先点击获取焦点,第二次点击才会响应,解决办法改用setOnTouchListener监听,

android.view.View下的OnTouchListener接口是只要触摸(touch)状态改变,就会触发该事件。

代码如下:


chatSendMessage.setOnTouchListener(new View.OnTouchListener() {
    //按住和松开的标识
    int touch_flag=0;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        touch_flag++;
        if(touch_flag==2){
            touch_flag=0;
            //自己的业务

	    emojiconMenuContainer.setVisibility(View.GONE);
} return false; }});

### 点击两次才能触发点击事件的原因 在 Android 中,某些控件(如 `TextView` 或 `EditText`)在特定情况下需要点击两次才能触发 `onClick` 事件。这种现象通常与控件的焦点获取机制有关。当控件设置为 `focusableInTouchMode="true"` 时,第一次点击会用于获取焦点,而第二次点击才会真正触发点击事件。这种行为在某些场景下会导致用户体验上的问题[^2]。 ### 解决方案 #### 1. 使用 `OnTouchListener` 替代 `OnClickListener` 通过使用 `OnTouchListener` 并在 `ACTION_UP` 事件中处理点击逻辑,可以避免两次点击的问题。在 `onTouch` 方法中判断 `MotionEvent.ACTION_UP` 事件,以确保点击动作只在手指抬起时触发。示例代码如下: ```java view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { // 处理点击逻辑 } return false; } }); ``` #### 2. 修改 `focusableInTouchMode` 属性 如果控件不需要在触摸模式下获取焦点,可以将 `focusableInTouchMode` 设置为 `false`。这样可以避免控件在第一次点击时仅用于获取焦点的情况,从而直接触发点击事件。XML 布局中可以这样设置: ```xml <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusableInTouchMode="false" android:text="Click Me" /> ``` #### 3. 结合 `OnTouchListener` 和 `OnClickListener` 在某些情况下,可以在 `OnTouchListener` 中处理 `ACTION_DOWN` 和 `ACTION_UP` 事件,并手动调用 `performClick()` 方法来触发点击事件。这样可以确保点击事件在单次点击中完成。示例代码如下: ```java view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { v.performClick(); // 手动触发点击事件 } return false; } }); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理点击事件 } }); ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值