最近发现部分新入门的开发者经常问的一个焦点问题,就写一篇博客给大家说一说,顺带将Edittext会产生的一个默认输入法的显示和隐藏普及一下。
一、焦点问题
1、焦点问题
开发中常遇到的问题,特别是列表类控件(尤以ListView为甚,现在不建议列表控件使用ListView,这已经过时很久,现在RecyclerView已经普及)。大家可能遇到过,用一个容器类控件(布局)去装很多个视图类控件
(Button,ImageView,ImageButton,CheckBox...等)作为列表控件的Item,然后去点击Item时,没有反应,整个Item无法获取到焦点。原因在于在自定义的Item中存在包含Clickable或Checkable属性的子类控件,如
Button,ImageButton,CheckBox等。这些控件会在初始化之初,将焦点获取到,所以常常点击Item变化的是Item的子控件,而Item本身没有反应。Google为解决此类问题,在xml中定义了一个属性android:descendantFocusability。
2、android:descendantFocusability
android:descendantFocusability 定义了当一个View获取焦点时,ViewGroup与其子控件两者之间的关系。
该属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants: viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
二、输入法的显示与隐藏
1、获取系统默认输入法管理器
InputMethodManager imManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
2、显示系统默认输入法(SHOW_FORCED为强制显示)
imManager.showSoftInput(View,InputMethodManager.SHOW_FORCED);//View为需要键盘输入的视图
3、隐藏系统默认输入法
imManager.hideSoftInputFromWindow(View.getWindowToken(), 0);//View为需要键盘隐藏的视图
或者
imManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NO T_ALWAYS);
4、如果输入法在窗口上已经显示,则隐藏,反之则显示
imManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
5、获取输入法是否显示的状态
boolean isShow = imManager.isActive();//true为已经显示,false为隐藏
6、如果一个页面包含Edittext控件,在页面显示时,Edittext会自动获得焦点,并弹出软键盘,如果不想弹出软键 盘有两种类型的方法:
①在清单文件中将对应的Activity设置:
android:windowSoftInputMode="stateHidden"
或者
android:windowSoftInputMode="stateUnchanged"
②让页面内其他不是Edittext类型的控件获得焦点
一般操作为,在xml中为其他控件添加:
android:focusable="true"
android:focusableInTouchMode="true"
即可。