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

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


目录
相关文章
|
存储 Android开发
如何查看Flutter应用在Android设备上已被撤销的权限?
如何查看Flutter应用在Android设备上已被撤销的权限?
772 64
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
存储 Android开发 数据安全/隐私保护
如何在Android设备上撤销Flutter应用程序的所有权限?
如何在Android设备上撤销Flutter应用程序的所有权限?
1016 64
|
缓存 Android开发 开发者
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
Flutter环境配置完成后,如何在Android设备上运行Flutter应用程序?
2756 62
|
开发工具 Android开发 开发者
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
在Android设备上运行Flutter应用程序时,如果遇到设备未授权的问题该如何解决?
1103 61
|
11月前
|
存储 持续交付 Docker
Docker:颠覆传统开发的轻量级容器革命
Docker:颠覆传统开发的轻量级容器革命
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
468 0
|
存储 开发工具 开发者
揭秘 Microsoft.Docker.SDK:让容器开发更轻松的强大工具揭秘
随着云计算和容器技术的快速发展,`Docker` 已经成为容器化技术的事实标准。`Microsoft` 作为 `Docker` 的主要支持者和参与者,推出了 `Microsoft.Docker.SDK`,旨在帮助开发者更轻松地进行容器开发。本文将深入揭秘 Microsoft.Docker.SDK 的功能、使用方法以及它在容器开发中的应用。
421 13
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10597 2