【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )
Android TV 開發系列文章目錄
【Android TV 開發】安卓電視調試 ( 開啟網絡遠程調試 )
【Android TV 開發】焦點處理 ( 父容器與子組件焦點獲取關系處理 | 不同電視設備上的兼容問題 | 觸摸獲取焦點 | 按鍵獲取焦點 )
文章目錄
- Android TV 開發系列文章目錄
- 一、父容器與子組件焦點獲取關系處理
- 二、不同電視設備上的兼容問題
- 三、按鍵獲取焦點
- 四、觸摸獲取焦點
一、父容器與子組件焦點獲取關系處理
在布局文件中 , 父容器的節點中使用 android:descendantFocusability 屬性 , 用于設置 父容器 與 子組件 之間的 焦點獲取先后順序 ;
<ScrollViewandroid:descendantFocusability="afterDescendants"android:layout_width="match_parent"android:layout_height="match_parent"></ScrollView>android:descendantFocusability 屬性取值 :
① beforeDescendants : 父容器 優先獲取焦點 , 如果父容器不需要焦點 , 子組件才能獲取到焦點 ;
② afterDescendants : 子組件 優先獲取焦點 , 如果子組件不需要獲取焦點 , 則父容器獲取焦點 ;
③ blocksDescendants : 只有 父容器 能獲取焦點 , 子組件不能獲取焦點 ;
二、不同電視設備上的兼容問題
在開發時遇到這樣一種情況 , 布局的樣式是 ScrollView 中嵌入一個 ConstraintLayout 布局 , 在 ConstraintLayout 布局中設置了很多需要獲取焦點的子組件 ;
運行正常的情況 : 在 Google 提供的模擬器上運行時 , 正常運行 , ScrollView 的子組件中可以正常獲取焦點 ;
運行失敗的情況 : 但是在真實的國產電視盒子中 , ScrollView 始終組織其子組件獲取焦點 , 即使設置了 android:descendantFocusability=“afterDescendants” , 子組件也無法獲取焦點 ;
最終的解決方案 : 在子組件中 , 將需要獲取焦點的組件都添加 android:focusable=“true” 屬性 , 這樣就解決了上述問題 ;
由此可見 , 相同的代碼 , 在不同型號 , 版本 , 廠家 的電視設備上 , 焦點的獲取 , 移動 , 表現是不一樣的 , 因此這里就涉及到了焦點的兼容問題 ;
本次在 康佳 電視盒子中 , ScrollView 會阻斷子組件的焦點獲取 , 但是在其它界面 , 沒有添加 android:focusable=“true” 屬性 , 焦點獲取功能也可以正常使用 , 這就比較難受 ;
這里建議 : 為了適配盡可能多的電視設備 , 推薦如下做法 :
① 設置可獲取焦點 : 給 需要獲取焦點的組件 , 統一添加 android:focusable="true" 屬性 ;
② 設置不可獲取焦點 : 凡是 不需要獲取焦點的組件 , 統一添加 android:focusable="false" 屬性 ;
③ 設置組件兼容 : 凡是涉及到 父容器 與 子組件 之間的焦點獲取的情況 , 統一使用 android:descendantFocusability 屬性 ;
三、按鍵獲取焦點
按鍵獲取焦點 : 在手機上按鍵獲取焦點已經不常用 , 使用遙控器 / 手柄 控制界面需要關注該操作 ;
在 xml 布局文件中 , 在組件節點上設置如下屬性 , 取值 true 或 false ;
android:focusable="true"按鍵獲取焦點 一般是手機自帶的物理鍵盤 , D-Pad 遙控器 ( 電視遙控器 ) , 游戲手柄 等 , 使用方向鍵 , 控制焦點改變 ;
如果該 android:focusable 屬性設置為 true , 則說明該組件可以獲取焦點 , 按照不同的方向按鍵 , 焦點跳轉到本組件設定的對應方向上的件 id 對應的組件 ;
四、觸摸獲取焦點
觸摸獲取焦點 : 目前的觸摸屏手機控制焦點的主流操作 ;
在 xml 布局文件中 , 在組件節點上設置如下屬性 , 取值 true 或 false ;
android:focusableInTouchMode="true"Button , TextView , 布局組件 , 等默認沒有觸摸焦點 , 因為這些組件可能用于點擊事件 , 如果這些組件可獲取焦點 , 用戶點擊這些組件后 , 要先獲取焦點 , 觸發 OnFocusChangeListener 回調 , 獲取焦點后才能進行點擊 ;
EditText 默認自動獲取焦點 , 并且進入界面搶先獲取焦點 , 該組件需要有光標 , 并且彈出軟鍵盤 ;
總結
以上是生活随笔為你收集整理的【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OkHttp】OkHttp 源码分析
- 下一篇: 【Android 事件分发】事件分发源码