EditText
EditText的焦点问题
问题描述: 有时个一个界面有editext的时候,我们希望它不自动获得焦点,但是editext调用clearFocus方法都没有用
解决办法: 在EditText的父级控件中找一个,设置成
android:focusable="true"
android:focusableInTouchMode="true"
- 有的时候,当EditText获得焦点与否,UI不同,这时个可以重载焦点的监听函数
mSearchInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
mSearchLeft.setVisibility(View.VISIBLE);
mSearchCenter.setVisibility(View.GONE);
mSearchCancel.setVisibility(View.VISIBLE);
} else {
mSearchLeft.setVisibility(View.GONE);
mSearchCenter.setVisibility(View.VISIBLE);
mSearchCancel.setVisibility(View.GONE);
}
}
});
EditText的listener
EditText的listener主要用到的有2个:
addTextWatcher() setOnEditorActionListener()
一旦有搜索之类的行为,要定义imeOptions,并且重载它的actionListener, 并且很多listener之类 的代码都要注意返回是true,还是false,一般情况下返回true,表示处理了该事件,该事件不会再一次分发, 否则的话会再次分发
android:imeOptions="actionSearch"
mSearchInput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_UNSPECIFIED) {
String text = mSearchInput.getText().toString().trim();
if (KasUtil.isEmpty(text)) {
T.showShort(mContext, R.string.search_empty_hint);
return true;
}
Message msg = mHandler.obtainMessage(MSG_SEARCH);
msg.obj = text;
mHandler.sendMessage(msg);
return true;
}
return false;
}
});
点击空白处,关闭软键盘
- 问题描述: 点击空白处,关闭软键盘
- 解决原理: 重载activity, viewGroup的事件分发,如果MotionEvent的位置在EditText之中,则不用关闭, 否则的话闭闭软键盘
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点)
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
hideSoftInput(v.getWindowToken());
}
}
return super.dispatchTouchEvent(ev);
}
private boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] l = { 0, 0 };
v.getLocationInWindow(l);
int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left
+ v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击EditText的事件,忽略它。
return false;
} else {
return true;
}
}
// 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点
return false;
}
EditText删除最后一个字符
有时候,比如表情栏要点一个图标,删除最后一个表情
public static void backspace(EditText editText) { KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL); editText.dispatchKeyEvent(event); }
动态设置EditText的字数限制
有时候,我们需要动态设置EditText的最大字数限制,代码如下:
InputFilter[] filters = {new InputFilter.LengthFilter(NAME_MAX_LENGTH)}; mEtGroupName.setFilters(filters);