【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Android TV 开发】焦点处理 ( 父容器与子组件焦点获取关系处理 | 不同电视设备上的兼容问题 | 触摸获取焦点 | 按键获取焦点 )

文章目录

Android TV 开发系列文章目录

一、父容器与子组件焦点获取关系处理

二、不同电视设备上的兼容问题

三、按键获取焦点

四、触摸获取焦点





一、父容器与子组件焦点获取关系处理


在布局文件中 , 父容器的节点中使用 android:descendantFocusability 属性 , 用于设置 父容器 与 子组件 之间的 焦点获取先后顺序 ;


 

<ScrollView
        android: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 默认自动获取焦点 , 并且进入界面抢先获取焦点 , 该组件需要有光标 , 并且弹出软键盘 ;


目录
相关文章
|
7天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
107 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
17天前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
71 6
|
2月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
163 11
|
1月前
|
存储 持续交付 Docker
Docker:颠覆传统开发的轻量级容器革命
Docker:颠覆传统开发的轻量级容器革命
|
2月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
102 0
|
3月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
180 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
572 1
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
217 5
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
133 3