Android TV(開發) GradView重新整理後搶焦點的問題
阿新 • • 發佈:2019-01-01
問題描述
GridView設定setFocusable為false,當前焦點也確實不在GridView上,但是第一個item的文字在跑馬。
所以綜合下來是,重新整理後GridView的第一個item預設被select了。如果GridView設定有selector,就可以看到雖然它沒有焦點,但是第一個item是被選中的。
此問題只出現在SDK4.4中
參考了:https://blog.csdn.net/sapodilla/article/details/77944305
得知這個問題是android4.4的一個BUG,在呼叫notifyDataSetChanged的時候註釋掉了判斷touchmode
解決方法
繼承gridview重寫裡面的isInTouchMode方法
public class CommonGridView extends GridView {
public CommonGridView(Context context) {
super(context);
}
public CommonGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CommonGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public CommonGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean isInTouchMode() {
Log.d("Main", "CommonGridView isInTouchMode() super.isInTouchMode():" + super.isInTouchMode() + " hasFocus():" + hasFocus());
if (Build.VERSION.SDK_INT == 19) {
// return !(hasFocus() && !super.isInTouchMode());
// return (hasFocus() && !super.isInTouchMode());
return !isInTouchMode;
}
return super.isInTouchMode();
}
// 是否要獲取焦點
boolean isInTouchMode;
public void setInTouchMode(boolean hasFocus){
isInTouchMode = hasFocus;
}
}
注:在實際使用中isInTouchMode()返回true,是不獲取焦點,第一個item不會被seleted。返回false,則會被選中。
我這裡不同的是,在介面初始化時GridView不可以搶焦點,但是焦點從左側移動到它身上時要求它獲取焦點。如果isInTouchMode()一直返回true,即使GradView的focusable為true也獲取不到焦點,所以需要在外部動態設定setInTouchMode()。