ListView 焦点

对于一个布局,其根目录的View将屏蔽他所有子控件的Focus状态,即便这些子控件设置成了Focusable=“true”,其实这段话的意思就是这个变量代表着当前的View将不顾其子控件是否可以Focus自身接管了所有的Focus,通常默认能获得focus的控件有Button,Checkable继承来的所有控件。

这就意味着如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法。

然而将ListView的Item Layout的子控件focusable属性设置为false有点繁琐,我们可以通过对Item Layout的根控件设置其android:descendantFocusability=”blocksDescendants”即可,这样Item Layout就屏蔽了所有子控件获取Focus的权限,不需要针对Item Layout中的每一个控件重新设置focusable属性了,如此就可以顺利的响应onItemClickListener中的onItenClick()方法了。

例如我的ListViw的每个item项是RelativeLayout,那么设置RelativeLayout的android:descendantFocusability=”blocksDescendants”即可。

 

两个ListView的焦点问题:

两个ListView只能使其中一个获取焦点而另外一个无法获取到焦点,可以通过以下方法强制转移焦点。

listView2.setFocusable(true);

listView2.setFocusableInTouchMode(true);

listView2.requestFocus();

listView2.requestFocusFromTouch();

ListView1.clearFocus();

以上代码可以将焦点从listView1上移动到listView2上来。

你可能感兴趣的:(android,android,android)