Dialog 焦点问题,ListView 与 CheckBox 的焦点问题

最近又遇到焦点问题,来总结一下。



之前在做自定义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

public void onWindowFocusChanged(boolean hasFocus) {
    // TODO Auto-generated method stub
    super.onWindowFocusChanged(hasFocus);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值