好久没来总结知识了,这个习惯不能丢。
今天写一个界面,要用到一个很基础的控件 -- EditText
然而出现了很多问题,下面一一列出问题和解决方法
1.监听EditText的文字输入
动态监听文字输入长度,可以给出提示,限制输入文字长度
监听器:
class EditChangedListener implements TextWatcher {
private CharSequence temp;//监听前的文本
private inteditStart;//光标开始位置
private inteditEnd;//光标结束位置
private finalintcharMaxNum =10;
@Override
public void beforeTextChanged(CharSequence s,int start,int count,int after) {
if(DEBUG)
Log.i(TAG,"输入文本之前的状态");
temp = s;
}
@Override
public void onTextChanged(CharSequence s,int start,int before,int count) {
if(DEBUG)
Log.i(TAG,"输入文字中的状态,count是一次性输入字符数");
mTvAvailableCharNum.setText("还能输入"+ (charMaxNum - s.length()) +"字符");
}
@Override
public void afterTextChanged(Editable s) {
if(DEBUG)
Log.i(TAG,"输入文字后的状态");
/** 得到光标开始和结束位置 ,超过最大数后记录刚超出的数字索引进行控制 */
editStart = mEditTextMsg.getSelectionStart();
editEnd = mEditTextMsg.getSelectionEnd();
if(temp.length() > charMaxNum) {
Toast.makeText(getApplicationContext(),"你输入的字数已经超过了限制!", Toast.LENGTH_LONG).show();
s.delete(editStart -1, editEnd);
int tempSelection = editStart;
mEditTextMsg.setText(s);
mEditTextMsg.setSelection(tempSelection);
}
}
};
给EditText添加监听:
mEditTextMsg.addTextChangedListener(new EditChangedListener());
2.和输入法的冲突,点开输入法后被遮挡
第一种解决方法,在manifest文件中,给对应的Activity增加一行代码:
android:windowSoftInputMode="adjustResize"
第二种解决方法,写一个监听器,通过监听软键盘是否打开或关闭来进行相应操作,代码中加粗的注释部分就是思路,此方法有点麻烦,但也是一种思路,以后找到更好的方法再来更新
/**
* 软键盘的监听
*/
public class KeyBoardShowListener {
private Context ctx;
public KeyBoardShowListener(Context ctx) {
this.ctx = ctx;
}
OnKeyboardVisibilityListener keyboardListener;
public OnKeyboardVisibilityListener getKeyboardListener() {
return keyboardListener;
}
public interface OnKeyboardVisibilityListener {
void onVisibilityChanged(boolean visible);
}
public void setKeyboardListener(final OnKeyboardVisibilityListener listener, Activity activity) {
final View activityRootView = ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
private boolean wasOpened;
private final int DefaultKeyboardDP = 100;
// From @nathanielwolf answer... Lollipop includes button bar in the root. Add height of button bar (48dp) to maxDiff
private final int EstimatedKeyboardDP = DefaultKeyboardDP + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? 48 : 0);
private final Rect r = new Rect();
@Override
public void onGlobalLayout() {
// Convert the dp to pixels.
int estimatedKeyboardHeight = (int) TypedValue
.applyDimension(TypedValue.COMPLEX_UNIT_DIP, EstimatedKeyboardDP, activityRootView.getResources().getDisplayMetrics());
// Conclude whether the keyboard is shown or not.
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
boolean isShown = heightDiff >= estimatedKeyboardHeight;
if (isShown == wasOpened) {
Log.e("Keyboard state", "Ignoring global layout change...");
return;
}
wasOpened = isShown;
listener.onVisibilityChanged(isShown);
}
});
}
}
//监听软键盘的状态
new KeyBoardShowListener(Activity.this).setKeyboardListener(
new KeyBoardShowListener.OnKeyboardVisibilityListener() {
@Override
public void onVisibilityChanged(boolean visible) {
if (visible) {
//软键盘已弹出
//隐藏多余界面,只展示EditText
} else {
//软键盘未弹出
//显示全部界面
}
}
}, Activity.this);
3.打开界面后,EditText直接获取焦点,打开输入法
在布局界面中,给EditText的父布局增加两行代码
android:focusable="true"
android:focusableInTouchMode="true"
4.修改EditText中的文字光标位置
EditText et = ...findViewById(...);
String text = "text";
et.setText(text);
et.setSelection(text.length());
其他一些有关EditText的内容:
---> 绑定软键盘到EditText
edit.setFocusable(true);
edit.setFocusableInTouchMode(true);
edit.requestFocus();
InputMethodManager inputManager = (InputMethodManager)edit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(edit, 0);
---> 去除软键盘显示:
editMsgView.setText("");
editMsgView.clearFocus();
//close InputMethodManager
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editMsgView.getWindowToken(), 0);
--->始终不弹出软件键盘:
EditText edit=(EditText)findViewById(R.id.edit); edit.setInputType(InputType.TYPE_NULL);
或者这样也可以:
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm.isActive()){ //这里可以判断也可以不判断
imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0 );
}
设置EditText输入类型
例如:身份证
android:digits="0123456789xX"
android:inputType="number"
CoderTung的第8篇知识储备。
网友评论