Android TV端弹出的PopupWindow没有获取焦点

在 TV 开发中,焦点管理是通过 Focus Navigation 实现的,PopupWindow 默认不接受焦点,导致遥控器无法选择弹窗内的控件。这是因为 PopupWindow 默认不会将焦点传递到其内容视图上。

要解决问题,可以通过以下步骤调整 PopupWindow 的焦点行为。


解决方法

1. 设置 PopupWindow 可聚焦并允许其内容获取焦点

确保 PopupWindowfocusable 属性为 true,并强制让其内容视图可以获取焦点。

BasePopupWindow 的构造函数中添加以下代码:

setFocusable(true); // 允许 PopupWindow 获取焦点
setOutsideTouchable(false); // 禁止点击外部关闭(可选,根据需求调整)

完整代码修改:

public BasePopupWindow(Context context, int layoutResId, int width, int height, boolean focusable) {super(width, height, focusable);binding = DataBindingUtil.inflate(LayoutInflater.from(context), layoutResId, null, false);setContentView(binding.getRoot());setBackgroundDrawable(new ColorDrawable(0x00000000)); // 默认背景透明setFocusable(true); // 确保弹窗获取焦点setOutsideTouchable(false); // 避免点击外部时关闭,保证焦点initialize(); // 子类实现具体逻辑
}

2. 强制请求焦点到弹窗的内容

LogoutPopupWindowinitialize 方法中,调用 requestFocus() 将焦点移动到弹窗的按钮上。

@Override
protected void initialize() {// 设置动态文案binding.tvMessage.setText(username + ",是否退出登录?");// 设置按钮点击事件binding.btnConfirm.setOnClickListener(v -> {Toast.makeText(binding.getRoot().getContext(), username + "已退出登录", Toast.LENGTH_SHORT).show();dismissPopup();});binding.btnCancel.setOnClickListener(v -> dismissPopup());// 强制将焦点设置到退出按钮上binding.btnConfirm.post(() -> binding.btnConfirm.requestFocus());
}

3. 确保布局中的控件支持焦点

popup_logout.xml 中,确保按钮和其他交互控件明确声明支持焦点和点击事件:

<Buttonandroid:id="@+id/btn_confirm"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="退出登录"android:focusable="true"android:clickable="true"android:backgroundTint="@android:color/holo_red_light"android:textColor="@android:color/white"android:layout_marginTop="8dp" /><Buttonandroid:id="@+id/btn_cancel"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="取消"android:focusable="true"android:clickable="true"android:backgroundTint="@android:color/darker_gray"android:textColor="@android:color/white"android:layout_marginTop="8dp" />

4. 使用 WindowManager.LayoutParams 设置焦点模式

确保 PopupWindow 在显示时优先处理焦点事件。可以在弹窗显示时配置 WindowManager.LayoutParams

@Override
public void showAtLocation(View parent, int gravity, int x, int y) {super.showAtLocation(parent, gravity, x, y);getContentView().setFocusable(true); // 内容允许聚焦getContentView().setFocusableInTouchMode(true);
}

完整流程

  1. BasePopupWindow 中:
    • 确保 setFocusable(true)setOutsideTouchable(false)
  2. 在布局文件中:
    • 明确声明交互控件支持焦点和点击事件。
  3. initialize() 方法中:
    • 使用 requestFocus() 将初始焦点设置到弹窗内的某个控件。
  4. showAtLocationshowAsDropDown 中:
    • 确保视图允许焦点和触摸模式。

完成这些步骤后,弹出的 PopupWindow 就会正确响应 TV 遥控器的焦点导航。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化

课程介绍 参加“Microsoft Power Platform 在线技术公开课&#xff1a;实现业务流程自动化”活动&#xff0c;了解如何更高效地开展业务。参加我们举办的本次免费培训活动&#xff0c;了解如何借助 Microsoft AI Builder 和 Power Automate 优化工作流。结合使用这些工具可以帮…

FPGA(二)组成结构基础内容

1. FPGA的基本结构 FPGA主要由以下部分组成&#xff1a; &#xff08;1&#xff09;可编程逻辑单元&#xff08;CLB&#xff09;&#xff1a;CLB是FPGA中最基本的逻辑单元&#xff0c;由查找表&#xff08;LUT&#xff09;和触发器组成&#xff0c;可实现任意逻辑功能。查找表…

LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作

近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展突飞猛进&#xff0c;逐步缩小了与通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3&#xff0c;作为一款强大的混合专家模型&#xff08;Mixture-of-Experts, MoE&a…

el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)

好的&#xff0c;我来帮你分析前端为什么只能展示 10 条数据&#xff0c;以及如何解决这个问题。 问题分析&#xff1a; pageSize 的值&#xff1a; 你的 el-pagination 组件中&#xff0c;pageSize 的值被设置为 10&#xff1a;<el-pagination:current-page"current…

TCP网络编程(一)—— 服务器端模式和客户端模式

这篇文章将会编写基本的服务器网络程序&#xff0c;主要讲解服务器端和客户端代码的原理&#xff0c;至于网络名词很具体的概念&#xff0c;例如什么是TCP协议&#xff0c;不会过多涉及。 首先介绍一下TCP网络编程的两种模式&#xff1a;服务器端和客户端模式&#xff1a; 首先…

C# 设计模式(行为型模式):责任链模式

C# 设计模式&#xff08;行为型模式&#xff09;&#xff1a;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于让多个对象有机会处理同一个请求&#xff0c;避免请求发送者与接收者之间的耦合。它通过将请…

在K8S中,如何部署kubesphere?

在Kubernetes集群中&#xff0c;对于一些基础能力较弱的群体来说K8S控制面板操作存在一定的难度&#xff0c;此时kubesphere可以有效的解决这类难题。以下是部署kubesphere的操作步骤&#xff1a; 操作部署&#xff1a; 1. 部署nfs共享存储目录 yum -y install nfs-server e…

CSS系列(43)-- Anchor Positioning详解

前端技术探索系列&#xff1a;CSS Anchor Positioning详解 &#x1f3af; 致读者&#xff1a;探索智能定位的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Anchor Positioning&#xff0c;这个强大的元素定位特性。 基础概念 &#x1f680; 锚点设…

Python判别不同平台操作系统调用相应的动态库读写NFC

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bV0E4YV&ftt&id615391857885 import sys import struct # struct的pack函数把任意数据类型变成字符串 import ctypes # 调用DLL动态库要有这个引用if sys.platform…

树莓派之旅-第一天 系统的烧录和设置

自言自语&#xff1a; 在此记录一下树莓派的玩法。以后有钱了买点来玩啊草 系统的安装烧录 系统下载 树莓派官网&#xff1a;https://www.raspberrypi.com/ 首页点击SoftWare进入OS下载页面 这里是安装工具&#xff1a;安装工具负责将系统镜像安装到sd卡中 点击下载符合自己…

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…

人工智能及深度学习的一些题目

1、一个含有2个隐藏层的多层感知机&#xff08;MLP&#xff09;&#xff0c;神经元个数都为20&#xff0c;输入和输出节点分别由8和5个节点&#xff0c;这个网络有多少权重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;权重是连接神经元的参数&#xff0c;每个连接都有一…

Solon 加入 GitCode:助力国产 Java 应用开发新飞跃

在当今数字化快速发展的时代&#xff0c;Java 应用开发框架不断演进&#xff0c;开发者们始终在寻找更快、更小、更简单的解决方案。近期&#xff0c;Solon 正式加入 GitCode&#xff0c;为广大 Java 开发者带来全新的开发体验&#xff0c;尤其是在国产应用开发进程中&#xff…

VScode 只能运行c,运行不了c++的解决问题

原文链接&#xff1a;Vscode只能运行c&#xff0c;运行不了c的解决方法 VScode 只能运行c&#xff0c;运行不了c&#xff0c;怎么回事呢&#xff0c;解决问题&#xff1a; 在tasks.json中加上“"-lstdc"”&#xff0c; 这样之后 要重启VScode&#xff0c;点击链接…

Ansible Jinja2 语法简介及使用

1、Jinja2 介绍 Jinja2 是基于 python 的模板引擎&#xff0c;功能比较类似于 PHP 的 smarty&#xff0c;J2ee 的 Freemarker和velocity。它能完全支持unicode&#xff0c;并具有集成的沙箱执行环境&#xff0c;应用广泛。 jinja2使用BSD授权 Jinja2的语法是由 variables(变量…

SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现

在现代 Java 开发中&#xff0c;我们常常需要处理各种通用的功能和需求&#xff0c;诸如枚举的处理、JSON 数据处理&#xff0c;以及分页查询等。这些功能虽然看似简单&#xff0c;但在实际开发中往往涉及到许多细节和优化。为了提高开发效率、减少重复代码的编写&#xff0c;我…

游戏引擎学习第69天

回顾碰撞响应时我们停留的位置 从昨天的讨论开始&#xff0c;我们正准备处理碰撞响应的复杂性。具体来说&#xff0c;我们讨论的是&#xff0c;当两个实体在屏幕上发生碰撞时&#xff0c;如何回应这种情况。碰撞本身并不复杂&#xff0c;但要处理其后的反应和规则则更具挑战性…

【Linux】信号处理

一、Linux系统信号 1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起&#xff08;hang up&#xff09;进程2SIGINT中断进&#xff08;interrupt&#xff09;程3SIGQUIT停止&#xff08;stop&#xff09;进程9SIGKILL无条件终止&#xff08;terminate&#xff09;…

开源模型应用落地-qwen2-7b-instruct-LoRA微调-Axolotl-单机多卡-RTX 4090双卡(七)

一、前言 本篇文章将使用Axolotl去高效微调QWen2系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…

数据结构与算法学习笔记----快速幂

数据结构与算法学习笔记----快速幂 author: 明月清了个风 first publish time: 2025.1.2 ps⭐️快速幂的两道模版题&#xff0c;快速幂&#xff0c;乘法逆元&#xff0c;费马小定理 Acwing 875. 快速幂 [原题链接](875. 快速幂 - AcWing题库) 给定 n n n组 a i , b i , p i…