控件的clickable和focus

需求:希望点击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会导致控件的逻辑与之前的有不同,不建议使用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章