需求:希望点击linearlayout之后能够获取焦点,并响应点击事件。
一开始只对linearlayout设置了onclicklistenner,这样发现虽然能够响应点击事件,但是不能获取焦点。
修改:对linearlayout的布局文件中增加了
android:focusableInTouchMode="true"
结果:可以获取焦点,但是需要第二次点击才能响应点击事件。因为第一次点击先获取焦点,获取焦点后的点击动作才能响应点击事件。
修改:将处理事件从onClickListener修改到onFocusChange中,删除setOnclickListener方法。
mLinearLayout.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override public void onFocusChange (View v, boolean hasFocus) {
if (hasFocus) {
//do something
}
}
}
});
结果:不能获取焦点,不能响应事件
修改:增加setOnclickListener方法,但不做任何处理。
结果:可以获取焦点,可以响应事件。
原因:参见《setOnclickListener、setClickable》中内容
因为setOnclickListener会重绘View把setClickable设为true。
默认clickable为false,此时不能获取focus。
正确方法:在xml中设置clickable
android:clickable="true"
之前在某文章中看到说focusable会导致控件的逻辑与之前的有不同,不建议使用。