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

news2025/1/4 1:08:03

在 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 中,确保按钮和其他交互控件明确声明支持焦点和点击事件:

<Button
    android: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" />

<Button
    android: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.coloradmin.cn/o/2269217.html

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

相关文章

职场常用Excel基础01-数据验证

大家好&#xff0c;excel在职场中使用非常频繁&#xff0c;今天和大家一起分享一下excel中数据验证相关的内容~ 在Excel中&#xff0c;数据验证&#xff08;Data Validation&#xff09;是一项非常有用的功能&#xff0c;它可以帮助用户限制输入到单元格中的数据类型和范围&am…

Kubernetes Gateway API-3-TLS配置

1 简介 Gateway API 允许使用多种方式配置 TLS。本文档列出了各种TLS设置,并给出了如何有效使用它们的一般指南。 尽管本文档涵盖了 Gateway API 最常见的TLS配置形式,但某些实现也可能提供特定于实现的扩展,允许不同或更高级形式的TLS配置。除此文档外,值得阅读你所使用…

OpenGL入门最后一章观察矩阵(照相机)

前面的一篇文章笔者向大家介绍了模型变化矩阵&#xff0c;投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中&#xff0c;我们看到了即使没有观察矩阵&#xff0c;我们也能对绘制出来的模型有一…

3.CSS字体属性

3.1字体系列 CSS使用font-family属性定义文本的字体系列。 p{font-family:"微软雅黑"} div{font-family:Arial,"Microsoft Yahei",微软雅黑} 3.2字体大小 css使用font-size属性定义字体大小 p{ font-size:20px; } px(像素)大小是我们网页的最常用的单…

Spring-kafka快速Demo示例

使用Spring-Kafka快速发送/接受Kafka消息示例代码&#xff0c;项目结构是最基础的SpringBoot结构&#xff0c;提前安装好Kafka&#xff0c;确保Kafka已经正确启动 pom.xml&#xff0c;根据个人情况更换springboot、java版本等 <?xml version"1.0" encoding&qu…

R语言统计分析——自助法BOOTSTRAP(1)

参考资料&#xff1a;R语言实战【第2版】 所谓自助法&#xff0c;即从初始样本重复随机替换抽样&#xff0c;生成一个或一系列待检验统计量的经验分布。无需假设一个特定的理论分布&#xff0c;便可生成统计量的置信区间&#xff0c;并能检验统计假设。 举个例子&#xff1a; 我…

yolo数据集格式(txt)转coco格式,方便mmyolo转标签格式

近期使用mmyolo过程中发现工具自带的yolo2coco.py在转换完数据集格式后&#xff0c;可视化标签的时候会有标签错乱情况&#xff0c;具体原因也没找到&#xff0c;肯定是转换过程代码有问题&#xff0c;于是重新做一份代码直接从yolo数据集转化为coco的json格式。 代码如下&…

sonarqube 安装及使用

一、官网参考地址 相关版本下载地址 配置全局变量 .bash_profileexport SONAR_HOME=/Users/jd/soft/sonar-scanner-6.2.1.4610 export PATH=$PATH:$SONAR_HOME/bin export SQ_HOST=http://127.0.0.1:9000/ export SQ_TOKEN=squ_dbb1913e095a92a727a918a9ba6b1af94b007748二、…

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…

Lua语言入门 - Lua常量

在Lua中&#xff0c;虽然没有直接的常量关键字&#xff08;如C中的const&#xff09;&#xff0c;但你可以通过一些编程技巧和约定来实现类似常量的行为。以下是几种常见的方法&#xff1a; 1. 使用全局变量并命名规范 你可以定义一个全局变量&#xff0c;并通过命名约定来表示…

【brew安装失败】DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0

从你提供的 nslookup 输出看&#xff0c;DNS 查询 raw.githubusercontent.com 返回的是 0.0.0.0&#xff0c;这通常意味着无法解析该域名或该域名被某些 DNS 屏蔽了。这种情况通常有几个可能的原因&#xff1a; 可能的原因和解决方法 本地 DNS 问题&#xff1a; 有可能是你的本…

【竞技宝】LOL:IG新赛季分组被质疑

北京时间2024年12月31日&#xff0c;今天已经2024年的最后一天&#xff0c;在进入一月之后&#xff0c;英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉&#xff0c;其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…

Unity Excel转Json编辑器工具

功能说明&#xff1a;根据 .xlsx 文件生成对应的 JSON 文件&#xff0c;并自动创建脚本 注意事项 Excel 读取依赖 本功能依赖 EPPlus 库&#xff0c;只能读取 .xlsx 文件。请确保将该脚本放置在 Assets 目录下的 Editor 文件夹中。同时&#xff0c;在 Editor 下再创建一个 Exc…

【竞技宝】CS2:HLTV2024职业选手排名TOP15-xantares

北京时间2024年12月30日&#xff0c;HLTV年度选手排名正在持续公布中&#xff0c;今日凌晨正式公布了今年的TOP15选手为EternalFire战队的xantares选手。 选手简介 xantares是一名来自于土耳其的CS职业选手&#xff0c;出生于1995年&#xff0c;今年已经29岁。早在2012年&…

智能商业分析 Quick BI

Quick BI 是阿里云提供的一款智能商业分析&#xff08;BI&#xff09;工具&#xff0c;旨在帮助企业快速获取业务洞察、优化决策过程、提升数据分析效率。通过强大的数据可视化和分析功能&#xff0c;Quick BI 能够帮助用户轻松连接多种数据源、创建多维度的报表和仪表盘&#…

uniapp - 小程序实现摄像头拍照 + 水印绘制 + 反转摄像头 + 拍之前显示时间+地点 + 图片上传到阿里云服务器

前言 uniapp&#xff0c;碰到新需求&#xff0c;反转摄像头&#xff0c;需要在打卡的时候对上传图片加上水印&#xff0c;拍照前就显示当前时间日期地点&#xff0c;拍摄后在呈现刚才拍摄的图加上水印&#xff0c;最好还需要将图片上传到阿里云。 声明 水印部分代码是借鉴的…

2024年12月31日Github流行趋势

项目名称&#xff1a;free-programming-books 项目地址url&#xff1a;https://github.com/EbookFoundation/free-programming-books项目语言&#xff1a;HTML历史star数&#xff1a;344575今日star数&#xff1a;432项目维护者&#xff1a;vhf, eshellman, davorpa, MHM5000, …

基于SpringBoot+Vue实现停车场管理系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

Java学习路线:Servlet(一)认识和创建Servlet

目录 创建Servlet WebServlet Servlet的生命周期 认识和使用HttpServlet Servlet是JavaEE的一个标准&#xff0c;他就像JDBC一样&#xff0c;由官方定义了一系列接口&#xff0c;而具体的实现由我们自己编写&#xff0c;最后交给Web服务器如Tomcat来运行我们编写的Servlet…

公路边坡安全监测中智能化+定制化+全面守护的应用方案

面对公路边坡的安全挑战&#xff0c;我们如何精准施策&#xff0c;有效应对风险&#xff1f;特别是在强降雨等极端天气下&#xff0c;如何防范滑坡、崩塌、路面塌陷等灾害&#xff0c;确保行车安全&#xff1f;国信华源公路边坡安全监测解决方案&#xff0c;以智能化、定制化为…