最近又遇到焦点问题,来总结一下。
之前在做自定义Dialog 的时候,在 做编辑框的时候,就出现了 焦点冲突 的问题。
粘出代码:
<span style="white-space:pre"> </span>final AlertDialog dlg = new AlertDialog.Builder(this).create();
dlg.show();
Window window = dlg.getWindow();
window.setContentView(R.layout.win_dialog);
// 拿到输入框
final EditText editText = (EditText) window.findViewById(R.id.et_game_win);
当点击编辑框之后,不会弹出虚拟键盘,但是可以“粘贴”。
也就是说,在点击的那一刻,编辑框获取到了焦点,但是 当我手离开屏幕之后,编辑框就又失去了焦点。
在这块,出现这种情况的原因是 getWindow(); 因为,这里自定义dialog 的级别是window 级别的,当编辑框失去焦点的时候,window会立刻获取焦点。
所以无法弹出 虚拟键盘。
解决办法是,让他失去焦点,加入以下代码:
<span style="white-space:pre"> </span>// 处理输入框无法弹出
dlg.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
让window失去焦点,这样编辑框就一切正常。
这一次,是ListView 与 CheckBox 的 焦点问题。
当出现这种状况的时候, 点击 ListView的item 也相当于选中, 点击 CheckBox 那个框框 也算 选中,
这样的话, 就 有两个监听事件, 那么 问题来了!
CheckBox框框 本身就在 ListView 的Adapter 里面, 那么 当我点了 那个框框 的时候, 到底算是 点击了 框框 ,还是 点击了 item 呢?
所以!!! 这里就会出现焦点冲突的问题。
这里 我的 解决的办法是,让 CheckBox框框 失去 焦点。
在布局文件中加入这个代码
android:focusable="false"
加了这个之后,CheckBox 就会失去焦点。 这样就只有点击 item 才算是点击。
出现这个问题之后,问了度娘 一些关于焦点问题。
在此记录,以便查看。
一. 主动获取焦点
setFocusable(true); // 是设置能否获得焦点而已。.
requestFocus(); //是让控件得到焦点
<span style="font-family:Microsoft YaHei;font-size:14px;">requestFocusInWindow() //的作用应该是获取窗口的焦点</span>
二.子类是否获取焦点
该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了
三:监听activity获取/失去焦点(onWindowFocusChanged)
作用:1.可以监听activity获取/失去焦点 【hasFocus: true 获取焦点, false失去焦点】
2.判断activity加载完成(当所有生命周期完成后调用该方法)
@Override