text从华为p9软键盘删除时无响应到inputconnectionwrapper(代码片段)

author author     2022-11-28     174

关键词:

从华为P9软键盘删除时无响应到InputConnectionWrapper
96  阿敏其人 
2017.02.13 22:12* 字数 457 阅读 786评论 1喜欢 3
一、起因
一个需求,类似微信将群,即多选好友之后,在页面有一个列表显示已选好友的头像,这是如果Edittext内容为空并且按下软键盘的删除键,第一次让头像变灰,第二次则删减最后一个已经勾选的成员。

效果大概如下图:

联动.gif
实现就实现呗,按道理我们搞一个Edittext,然后按照如下代码,应该是没什么问题的

        mEt.setOnKeyListener(new View.OnKeyListener() 
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) 
                if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) 
                    String content = mEt.getText().toString();
                    if (TextUtils.isEmpty(content)) 
                        mTvResult.setText("原生Et 无内容");
                    else
                        mTvResult.setText("原生Et DEL_DOWN:  "+content);
                    
                
                return false;
            
        );
但是,部分机型,比如华为P9,当Edittext内容为空时,他就根本无法响应软键盘的删除监听,搞事情!

二、经过 (解决办法)
先看一些解决问题后的代码:

MainActivity

public class MainActivity extends AppCompatActivity 

    private EditText mEt;
    private ZanyEditText mZanyEt;
    private TextView mTvResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mEt = (EditText) findViewById(R.id.mEt);
        mZanyEt = (ZanyEditText) findViewById(R.id.mZanyEt);
        mTvResult = (TextView) findViewById(R.id.mTvResult);


        mEt.setOnKeyListener(new View.OnKeyListener() 
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) 
                if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) 
                    String content = mEt.getText().toString();
                    if (TextUtils.isEmpty(content)) 
                        mTvResult.setText("原生Et 无内容");
                    else
                        mTvResult.setText("原生Et DEL_DOWN:  "+content);
                    
                
                return false;
            
        );

        mZanyEt.setOnKeyListener(new View.OnKeyListener() 
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) 
                if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) 
                    String content = mZanyEt.getText().toString();
                    if (TextUtils.isEmpty(content)) 
                        mTvResult.setText("ZanyEt 无内容");
                    else
                        mTvResult.setText("ZanyEt DEL_DEL_DOWN:  "+content);
                    
                
                return false;
            
        );

    

.
.
布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/activity_main"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.amqr.editdemo.MainActivity">


    <EditText
        android:id="@+id/mEt"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="原生"

        />

    <com.amqr.editdemo.ZanyEditText
        android:id="@+id/mZanyEt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="重写"
        />

    <TextView
        android:id="@+id/mTvResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="RESULT"
        />

</LinearLayout>
.
.
.
核心文件
ZanyEditText

public class ZanyEditText extends EditText 
    private OnDelKeyEventListener delKeyEventListener;
    public ZanyEditText(Context context, AttributeSet attrs, int defStyle) 
        super(context, attrs, defStyle);
    
    public ZanyEditText(Context context, AttributeSet attrs) 
        super(context, attrs);
    
    public ZanyEditText(Context context) 
        super(context);
    
    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) 
        return new ZanyInputConnection(super.onCreateInputConnection(outAttrs),
                true);
    
    private class ZanyInputConnection extends InputConnectionWrapper 
        public ZanyInputConnection(InputConnection target, boolean mutable) 
            super(target, mutable);
        
        @Override
        public boolean sendKeyEvent(KeyEvent event) 
            if (event.getAction() == KeyEvent.ACTION_DOWN
                    && event.getKeyCode() == KeyEvent.KEYCODE_DEL) 
                if (delKeyEventListener != null) 
                    delKeyEventListener.onDeleteClick();
                    return true;
                
            
            return super.sendKeyEvent(event);
        
        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) 
            if (beforeLength == 1 && afterLength == 0) 
                return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DEL))
                        && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
                        KeyEvent.KEYCODE_DEL));
            
            return super.deleteSurroundingText(beforeLength, afterLength);
        
    
    /**
     * EditText 删除回调
     */
    public void setDelKeyEventListener(OnDelKeyEventListener delKeyEventListener) 
        this.delKeyEventListener = delKeyEventListener;
    
    public interface OnDelKeyEventListener 
        void onDeleteClick();
    

具体原因不是为什么P9等部分机器身上无法响应删除监听,接下来我们来看看下面这几点:

1、Edittext继承自TextView
2、翻看TextView的代码,里面有一个叫做InputConnection的东西,看起是什么输入连接的意思。
3、InputConnectionWrapper 是 InputConnection的实现类,我们继承这个包装类并且实现 sendKeyEvent 和 deleteSurroundingText 两个方法一下。
InputConnectionWrapper文档

--- sendKeyEvent
Send a key event to the process that is currently attached through this input connection.

将关键事件发送到当前通过此连接的进程。

其实我觉得大概是说怎么处理当前这个软件键的事件

--- deleteSurroundingText
Delete beforeLength characters of text before the current cursor position, and delete afterLength characters of text after the current cursor position, excluding the selection.

.
.
.
回顾核心代码

private class ZanyInputConnection extends InputConnectionWrapper 
        public ZanyInputConnection(InputConnection target, boolean mutable) 
            super(target, mutable);
        
        @Override
        public boolean sendKeyEvent(KeyEvent event) 
            if (event.getAction() == KeyEvent.ACTION_DOWN
                    && event.getKeyCode() == KeyEvent.KEYCODE_DEL) 
                if (delKeyEventListener != null) 
                    delKeyEventListener.onDeleteClick();
                    return true;
                
            
            return super.sendKeyEvent(event);
        
        @Override
        public boolean deleteSurroundingText(int beforeLength, int afterLength) 
            if (beforeLength == 1 && afterLength == 0) 
                return sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DEL))
                        && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP,
                        KeyEvent.KEYCODE_DEL));
            
            return super.deleteSurroundingText(beforeLength, afterLength);
        
    
Activity的处理下面的代码就可以顺利监听到删除键了。

  mZanyEt.setOnKeyListener(new View.OnKeyListener() 
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) 
                if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) 
                    String content = mZanyEt.getText().toString();
                    if (TextUtils.isEmpty(content)) 
                        mTvResult.setText("ZanyEt 无内容");
                    else
                        mTvResult.setText("ZanyEt DEL_DEL_DOWN:  "+content);
                    
                
                return false;
            
        );
上文ZanyEditText出处

三、结果
结果无非就是可以监听到了呗。

Android:从软键盘中删除 Enter 键

】Android:从软键盘中删除Enter键【英文标题】:Android:RemoveEnterKeyfromsoftkeyboard【发布时间】:2011-10-2221:47:23【问题描述】:在我的登录表单中,当用户单击EditText并按下回车键时,这会插入一个新行,因此会增加EditText的大小。下... 查看详情

移动端界面devicepixelratio问题与移动端软键盘keycode

现在移动端颗粒度越来越小,所以清晰度很高,如华为p9的devicePixelRatio为4,这是有多变态,devicePixelRatio是物理像素/逻辑像素=倍率devicePixelRatio,所以如倍率为4,一个像素在设备上放大了4倍,所以真实4像素是很难在设备上展示... 查看详情

我可以删除软键盘中的点(。)吗?

】我可以删除软键盘中的点(。)吗?【英文标题】:CanIdeletedot(.)inthesoftkeyboard?【发布时间】:2020-09-0502:31:13【问题描述】:我的应用程序中有editText字段,并获得8位数字来获取生日。所以现在它工作了。但应用中有.-按钮。<... 查看详情

text创建一个软删除标志查询(代码片段)

查看详情

java示例代码_从碎片内部隐藏软键盘

java示例代码_从碎片内部隐藏软键盘 查看详情

从字符串中删除软连字符

】从字符串中删除软连字符【英文标题】:Removingsofthyphensfromastring【发布时间】:2012-04-3008:06:39【问题描述】:假设我有一个带有软连字符的字符串(假设下面文本中的连字符是软连字符):T-h-i-s--i-s--a--t-e-s-t-.-我想删除软连字... 查看详情

java示例代码_如何从服务中打开(切换、设置)软键盘

java示例代码_如何从服务中打开(切换、设置)软键盘 查看详情

加入会议时无响应 SmackException NoResponseException

】加入会议时无响应SmackExceptionNoResponseException【英文标题】:NoresponsewhilejoiningconferenceSmackExceptionNoResponseException【发布时间】:2018-07-0207:47:34【问题描述】:我在加入会议聊天时遇到异常。例外:org.jivesoftware.smack.SmackException$NoRes... 查看详情

禁止移动端input弹出软键盘

在做三级联动,或者一些时间插件的时候总是弹出软键盘,用下面的方法就可以禁用掉,废话不多说直接上代码。 HTML代码<divclass=""><div><inputtype="text"id="disable1"class=""placeholder=""/></div><div><inputtype="text"i... 查看详情

Amazon IAP SDK:在 Live App Testing 中测试 IAP 时无响应

】AmazonIAPSDK:在LiveAppTesting中测试IAP时无响应【英文标题】:AmazonIAPSDK:NoresponsewhentestingIAPsinLiveAppTesting【发布时间】:2014-11-0502:36:55【问题描述】:我正在尝试将最新版本的AmazonIAPAPI集成到我的Android4+应用程序中。当应用程序侧... 查看详情

自定义数字软键盘

需求:1.数字键盘2.输入删除,光标要随之移动3.删除键长按全部清除4.点击键盘背景有颜色变换效果效果图:布局<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_p 查看详情

在 Sailsjs 中使用本地护照时无响应

】在Sailsjs中使用本地护照时无响应【英文标题】:NoResponsewhenusingpassport-localwithSailsjs【发布时间】:2014-03-2709:49:10【问题描述】:我正在尝试使用sailsjs实现本地护照,但在尝试进行身份验证时没有得到任何响应。代码如下://con... 查看详情

如何从 Apple 键盘听写中删除 TextView 中的蓝色虚线建议下划线?

】如何从Apple键盘听写中删除TextView中的蓝色虚线建议下划线?【英文标题】:HowtoremovebluedottedsuggestionunderlineinTextViewfromApplekeyboarddictation?【发布时间】:2019-01-1123:18:01【问题描述】:如果用户通过软键盘使用Apple听写,则在完成... 查看详情

jQuery Mobile 'Form' 没有从 PhoneGap 中的 iPhone 软键盘“GO”按钮提交

】jQueryMobile\\\'Form\\\'没有从PhoneGap中的iPhone软键盘“GO”按钮提交【英文标题】:jQueryMobile\'Form\'isnotgettingsubmittedfromtheiPhonesoftkeyboard"GO"buttoninPhoneGapjQueryMobile\'Form\'没有从PhoneGap中的iPhone软键盘“GO”按钮提交【发布时间】... 查看详情

emui5.0支持哪些手机

华为mate8、p9、p9plus、荣耀8、荣耀v8、麦芒5、Nova、G9plus、畅玩6x等机型都可以升级emui5.0系统。参考技术A  华为emui5.0支持哪些手机?华为推出了emui5.0系统,但花粉们不知道自己手机是否能用,下文带来华为emui5.0支持机型大全... 查看详情

Android:OnClickListener 在初始加载时无响应?

】Android:OnClickListener在初始加载时无响应?【英文标题】:Android:OnClickListenerunresponsiveonInitialLoad?【发布时间】:2016-10-2419:56:34【问题描述】:我遇到了一个奇怪的问题,我不确定是什么原因造成的。基本上,我使用ErrorFragment类... 查看详情

手机端浏览器中的html搜索框如何响应软键盘搜索按钮事件?

...一样不单独加一个搜索按钮在页面上,而是使用输入法软键盘里的搜索按钮或图标来触发事件。javascript里面如何响应这个搜索按钮事件?有什么独特的事件么?谢谢!很简单,input框外面加form表单即可。 <form><input ... 查看详情

android开发中,edittext点击事件可以响应,就是不弹出软键盘。怎么解决,edittext是在dialog中使用的

...输入类型2、设置输入类型为InputType.TYPE_NULL,禁止手机软键盘3、还原原来的输入类型,因为这次操作完,还要允许用户修改。4、弹出日期选择对话框,操作完后将结果显示到EditText上。隐藏软件盘,代码如下:EditTextet_start_time=(E... 查看详情