1. 程式人生 > >Android TV(開發) GradView重新整理後搶焦點的問題

Android TV(開發) GradView重新整理後搶焦點的問題

問題描述

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

的程式碼,導致一呼叫notifyDataSetChanged就模擬使用者點選了gridview。

解決方法

繼承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()。