关键词:
从华为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... 查看详情