需求:希望點擊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會導致控件的邏輯與之前的有不同,不建議使用。