1.引言
一直以來對焦點問題都是模模糊糊的只知道用android:focusableInTouchMode, android:focusable="true"。但是對他們并不是很理解.所以準備來徹徹底底的搞清楚android 里面的焦點問題。
2.正題
查看android api里面對focus的描述:
結論
setFocusable(true):表示此 View僅僅是能獲得焦點。
焦點的移動是采用給定方向上找到最近鄰居的算法。
view..requestFocus()請求獲得焦點
結論:
對于觸摸能力的設備,一旦用戶觸摸屏幕,設備將進入觸摸模式。從這一刻起,只有isfocusableintouchmode()為true的View 將能得到焦點,如文本編輯控件。可觸摸的View,如按鈕,不會占用焦點;他們只會觸發Click監聽。
3.試驗測試
3.1 測試1
xml樣式如下:很平常的LinearLayout布局。
MainActivity:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
Log.d(ss,"+++++++++++++++++++++++++++++edit獲取焦點");
}
}
});
button.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
Log.d(ss,"+++++++++++++++++++++++++++++button獲取焦點");
}
}
});
edit1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
Log.d(ss,"+++++++++++++++++++++++++++++edit1獲取焦點");
}
}
});
textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
if (b) {
Log.d(ss,"+++++++++++++++++++++++++++++text獲取焦點");
}
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();
}
});
正常情況下的結果(Button下面的輸入框獲取了焦點):
3.2 測試2
修改button的xml:添加android:focusableInTouchMode="true"
<Button
android:id="@+id/button"
android:text="焦點測試"
android:focusableInTouchMode="true"
android:layout_marginTop="15dp"
android:layout_width="match_parent"
android:layout_height="60dp"/>
結果:
由上倆個例子總結:
button默認是:android:focusableInTouchMode=“false”的
EditText默認是:android:focusableInTouchMode=“true”的
同時也驗證了上面的話:焦點的移動是采用給定方向上找到最近鄰居的算法。
3.3.分析ListView item點擊不了的原因
都知道當listview的item 由button,checkbox,edit的時候 ,點擊item是無法獲取onitemclick的監聽的。
OnItemClickListener的監聽的調用者是AbsListView。AbsListView繼承AdapterView。
當child能獲取到焦點或者child的子View中有能獲取到焦點的View。那么是不能執行performClick。performClick實際上就是調用的adapter的onitemClick事件。
我們知道input類型的控件,通過測試驗證了,Button,EditView,CheckBox等控件都是可以獲取到焦點的存在。故而不是執行performClick
驗證:item的布局只有一個TextView,因此能響應onItemClick事件。但是假如加入了focusable=“true”。他是否還能響應呢?結果是不能響應的。