最近做一个Android TV项目在给EditText设置输入类型为Password类型,同时需要隐藏系统键盘,网上找到几种方法:
1、在manifest中声明activity时加入
android:windowSoftInputMode="stateAlwaysHidden|stateHidden"
2、在Activity中输入以下代码:
InputMethodManager imm =
(InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(),0);
这对手机开发来说应该是有效可以解决问题的,但是这都对我都是无效的,在Android TV中,在不点击编辑框的情况下直接按下遥控键时界面还是会出现系统键盘,以下是我的解决方法:
//隐藏系统软键盘
inputText.setInputType(0);
//设置输入类型为PASSWORD
//inputText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
inputText.setTransformationMethod(PasswordTransformationMethod.getInstance());
好吧,虽然这样有用,但是光标不见了,这又是新的问题,好了,解决方法就是·自定义一个view继承EditText且重写它的方法,并写两个public方法pause()和resume(),在activity中调用(如果不这样,焦点会有问题),在如下所示:
public class CustomerEditText extends EditText{
public CustomerEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public CustomerEditText(Context context, AttributeSet attrs) {
this(context, attrs,-1);
}
public CustomerEditText(Context context) {
this(context,null);
}
private void init() {
pause();
setOnClickListener(mNoneClickListener);
resume();
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return null;
}
private OnClickListener mNoneClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// do nothing!!!
}
};
public void pause(){
setEnabled(false);
}
public void resume(){
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
setEnabled(true);
requestFocus();
}
}, 1000);
}
}
同时在Activity的onPause()和onResume()中调用自定义View的pause()和resume()方法。