Android EditText常用技能,包括clearFocus(),软键盘在界面开启关闭,点击关闭软键盘的问题
程序员文章站
2022-04-19 23:18:10
...
本篇文章将介绍Android中EditText的常用技能。
1.解决初次进入界面就弹出软件盘的问题:
首先产生该原因的根本原因是该EditText默认的获取了焦点了。
法1(不推荐):
强制不让其弹出软件盘
Mainfest.xml 设置属性
<activity android:name=".ui.activity.message.SessionActivity"
android:windowSoftInputMode="stateHidden|adjustPan"></activity>
Activity中onCreate()设置
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Android避免进入页面EditText自动弹出软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
该方法解决了不弹出软键盘,但是EditText 仍然获取了焦点了,效果是未弹出软键盘但光标仍然在闪
法2(推荐):
转移焦点,利用clearFocus()方法变相让其失去焦点,需要注意的是应当尽可能的转移到其父组件上
xml中,设置父组件可以获得焦点
<LinearLayout
android:layout_width="match_parent"
android:layout_height="97px"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<EditText
android:id="@+id/etContent"
android:layout_width="match_parent"
android:layout_height="80px"
android:background="@null"
android:drawableBottom="@drawable/selector_edit_focus"
android:visibility="visible"/>
</LinearLayout>
在activity中:
清除该EditText的焦点即可。
@Override
protected void onResume() {
super.onResume();
mEtContent.clearFocus();
}
该方法效果完美,而且易于实现。但是需要注意的是clearfocus之后就失去焦点了,也就不会响应点击事件,这个还是得权衡的
另外 view.requestFocus()是用户获取焦点的。mEditText.setCursorVisible(false)即设置光标不可见
当设置clearfocus()时,去点击编辑框,打印日志
/*做一下测试*/
mEtContent.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
Log.e("键盘", "ACTION_DOWN" );
break;
case MotionEvent.ACTION_MOVE:
Log.e("键盘", "ACTION_MOVE" );
break;
case MotionEvent.ACTION_UP:
Log.e("键盘", "ACTION_UP" );
break;
}
return false;
}
});
mEtContent.setOnClickListener(view -> {
Log.e("键盘", "OnClickListener" );
});
clearFocus()点击事件Log结果:
requestFocus()点击事件Log结果
比较发现:无焦点不响应点击事件
2. 解决在弹出软件盘时立即退出该界面会出现界面错位的问题
我们可能会遇到当弹出软键盘时,用户突然点击了标题栏的返回按钮,这时候假若是退出到Fragment直接finish掉会出布局错落的问题。这时候需要先关闭再退出,而这时候的问题是可能是同步的,问题依旧还是会有,这时可以加个肉眼看不到的延迟。
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 隐藏软键盘
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
// 延迟个0.1秒是因为 可能推出太快导致软键盘刚刚被回收,前面的界面出现断层
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
finish();
嗯,很粗暴,但很管用啊。这里软键盘我直接关闭了也不太好,最好是可以判断下,但是貌似也没有特别好的api一定可以判断是弹出或者隐藏的,有时间做这个操作,直接关了岂不是更好呢。
3. 点击空白实现软键盘的隐藏
public static void hideKeyboard(MotionEvent event, View view,
Activity activity) {
try {
if (view != null && view instanceof EditText) {
int[] location = { 0, 0 };
view.getLocationInWindow(location);
int left = location[0], top = location[1], right = left
+ view.getWidth(), bootom = top + view.getHeight();
// 判断焦点位置坐标是否在空间内,如果位置在控件外,则隐藏键盘
if (event.getRawX() < left || event.getRawX() > right
|| event.getY() < top || event.getRawY() > bootom) {
// 隐藏键盘
IBinder token = view.getWindowToken();
InputMethodManager inputMethodManager = (InputMethodManager) activity
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(token,
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
View view = getCurrentFocus();
UIUtils.hideKeyboard(ev,view,SessionActivity.this);
break;
}
return super.dispatchTouchEvent(ev);
}
上一篇: 为什么离婚