一、项目背景
项目要求将APP适配一款键盘机,屏幕大小240*320,不支持触屏。针对小屏幕适配,首先需要在res资源文件夹下新建文件夹,命名为layout-small,将需要适配的页面复制到该文件夹,并修改尺寸等等。
我在做这个项目时,参考了很多TV android的文章,很类似,都是使用键盘的方式移动焦点。
主要难点:键盘方式主要难点在于焦点移动和键盘事件的处理。
二、分析
需求:通过方向键左右按键控制显示的子界面
原始界面分析:
原始界面为DrawerLayout布局,抽屉部分在键盘机中不显示,主界面部分是一个FrameLayout,截图如下:
项目在键盘机的截图
整个页面分为两个部分,标题栏是一个Radiogroup,其中有四个Radiobutton,
每个RadioButton关联一个Fragment,来替换主界面标题栏以下部分。Xml代码如下:
触摸屏原有的点击方式切换:
通过hide和show的方式显示/隐藏fragment
上面是通过对Radiogroup中Radiobutton的状态变化监听来实现界面切换。
我们需要做的:通过键盘将焦点移动到对应的Radiobutton,然后调用performClick,触发点击事件即可。
键盘方式:
1. 新建数组 RadioButton radioButtons[]= new RadioButton[4]
将四个radioButtion加入数组中
2.在主界面Fragment(项目中为PhoneHomeFragment)新建onKeyDown的静态方法,该方法处理键盘的左右按键,按下左键则当前拥有焦点的radiobutton左边一个取得焦点,并触发点击,按下右键原理相同。通过数组和取余的方式处理焦点在最左边和最右边的情况
2. 在PhoneHomeFragment依附的activity中重写onKeyDown方法,并调用Fragment中的onKeyDown方法(忽略此处监听返回键的代码)
以上,则实现了通过左右键切换界面。
题外话:为什么需要这么麻烦呢?
每个页面都有很多需要焦点的控件,当焦点移动到标题栏以下,再想切换就比较又得把焦点移到上方。同时,很多情况下,焦点并不能按照我们希望的样子移动,将控件放入数组再手动改变焦点是一个不错的方式。