Android-GridView 的 OnItemClickListener 的事件無響應情況以及焦點被搶佔問題解決
GridView 的 OnItemClickListener 的事件無響應情況
RecyclerView 搶佔焦點
EditText 預設不獲取焦點
GridView 的 OnItemClickListener 的事件無響應情況
GridView 的 OnItemClickListener 的事件無響應情況:
網上說是因為:
listview、GridView 的子元素中包含了 Button 或者 ImageButton 之類的控制元件, 此類控制元件的優先順序高於 Listview 、GridView 所以不能監聽 Item 的點選事件。
解決辦法:
-
Item 的根節點加入 “android:descendantFocusability="blocksDescendants"
-
將xxxButton 換成 TextView 等普通 View
-
設定 ItemView clickable 為 FALSE;
-
設定 GridView : descendantFocusability="blocksDescendants"
-
設定 GridView 的 Focusable 為true
奈何嘗試了上面辦法後還是不成功,後來改為自定義介面實現點選事件,解決。
虛擬碼如下:
// 自己實現介面 public interface GridViewListener{ void onItemClick(int position); } private GridViewListener listener; public void setOnGridViewItemClickListner(GridViewListener listner){ this.listener = listner; } // item 點選 convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null){ listener.onItemClick(position); } } }); // 呼叫 gridAdapter.setOnGridViewItemClickListner(new HomeGridAdapter.GridViewListener() { @Override public void onItemClick(int position) { Log.e(TAG, "onItemClick: ------------->>>" ); } });
上面提到了android:descendantFocusability
,這東西的作用是什麼呢?
android:descendantFocusability
的該屬性是當一個為view
獲取焦點時,定義viewGroup
和其子控制元件兩者之間的關係。
android:descendantFocusability
的屬性值有三種:
viewgroup viewgroup viewgroup
RecyclerView 搶佔焦點、EditText 預設不獲取焦點
在父佈局新增:
android:focusable="true" android:focusableInTouchMode="true"
focusableInTouchMode
表示可以通過觸控獲取焦點
android:focusable=“true”
不會改變android:focusableInTouchMode
,因此只在鍵盤狀態下顯示焦點,在TouchMode
狀態下,依舊無法顯示焦點。
TouchMode
顧名思義就是“觸控模式”。Android系統的互動方式有方向鍵、滾動球和觸控幾種方式。採用方向鍵、滾動球等方式操作,需要通過焦點和高亮來表示此時操作的view
;如果裝置具備觸控能力,就可以通過觸控而不需要view
高亮,這種觸控的互動方式就是touch mode
。
3605" target="_blank" rel="nofollow,noindex">參考-說說Android中的touch mode
android:focusable=“false”
,一定會使android:focusableInTouchMode=“false”
。
相對的
android:focusableInTouchMode=“false”
,不會影響android:focusable
。
android:focusableInTouchMode=”true”
,一定會是android:focusable=“true”
所有的獲取焦點,都要有一個前提,該控制元件必須是可點選的,也就是該控制元件的clickable
屬性為true
,android:clickable=”true”
, 如果都點選不了,設定焦點有什麼作用呢?