Android移动应用中的焦点分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android移动应用中的焦点分析相关的知识,希望对你有一定的参考价值。
参考技术A 简单一点理解,在移动应用中,焦点就是当前正在处理事件的位置。在手机应用中,最有可能用到焦点的就是EditText,如果同一个界面中有多个EditText,通常情况下同一时间只有一个能够输入内容,此时,这个EditText就获取了焦点。在android中,对焦点的设置分为两种情况,TouchMode和非TouchMode。现在的手机基本都是触摸屏,我们用手指触摸屏幕来操作Android应用时,处于TouchMode。除了TouchMode之外,还有非TouchMode,利用外接设备来操作应用。比如键盘。使用Genymotion模拟器的时候,一个界面上有多个控件时,可以用电脑tab键来进行移动,被选中的控件会高亮显示,这时候就是非TouchMode,被选中的控件获得了焦点。
在手机应用中,用到焦点的时候并不多,但是TV应用中,需要用遥控器来操作选中控件,这时候就需要对焦点进行处理了。关于焦点,常用方法如下:
在View类中, isFocusable() 和 isFocusableInTouchMode() 获取到的结果都是false,也就是说,直接继承自View的控件是不能获取焦点的。我们常用控件中对这两个方法进行了改写,比如EditText,这两个方法都是true,而Button则只有 isFocusable() 返回true。这也就是为什么我们用tab键选取Button的时候能够高亮显示,而鼠标点击(模拟触控)的时候不能高亮显示的原因了。如果想在点击的时候也能高亮显示Button,需要手动设置 setFocusableInTouchMode(true) ,就可以了。
如果想对控件的焦点状态进行监听,需要设置 setOnFocusChangeListener() ,只要控件的焦点状态发生变化(获得或者失去焦点),都会调用 onFocusChange 方法
关于焦点的移动,默认的算法会寻找指定方向上最近的可以获取焦点的元素(非TouchMode)。另外在创建控件的时候,也可以指定寻找焦点的方向,设置nextFocusDown、nextFocusLeft、nextFocusRight 和 nextFocusUp的值为指定元素就可以了。看以下例子:
这里指定了上面的button向上寻找焦点时,下一个元素是id为bottom的元素,也就是说,上面的Button在获取了焦点之后,继续按向上键,系统会将焦点移动到id为bottom的元素上,而不是继续向上。
在开发手机应用的过程中,对焦点的处理并不多,它与事件是两个不同的体系,通常情况下焦点和事件是相互独立并不冲突。但是在Button的点击事件中会有一点问题。如果我们队一个button设置了 setFocusableInTouchMode(true) ,使他可以获取焦点,那么我们点击这个button的时候,第一次点击并不会执行 onClick() 方法,而是执行 onFocusChange() 。第二次点击的时候才会执行 onClick() 方法。看起来好像 onFocusChange() 消耗了点击事件,实际上并不是的。
这个问题我们看一下源码就清楚了:
onClick() 方法是在onTouchEvent的ACTION_UP里调用的,看一下View的onTouchEvent方法:
可以看到,只有当focusTaken为false的时候才会执行onClick,focusTaken的值默认是false的,但是在 isFocusable() && isFocusableInTouchMode() && !isFocused() 为true的时候,会去 requestFocus 获取焦点,并将值赋给focusTaken。
关键在于 isFocused() ,如果当前Button没有获取焦点, isFocused() 返回false, !isFocused() 值为ture,Button就会去获取焦点,从而导致 focusTaken 为true, onClick 方法就不会执行了,只有Button已经获取了焦点的时候才会执行onClick方法。
Android 软键盘隐藏了移动 HTML5 网络应用程序中的输入字段
【中文标题】Android 软键盘隐藏了移动 HTML5 网络应用程序中的输入字段【英文标题】:Android soft keyboard obscures input fields in mobile HTML5 web app 【发布时间】:2013-07-29 08:55:04 【问题描述】:我正在编写一个可在 Apple 和 Android 上运行的移动 HTML5 Web 应用程序。在我正在测试的 Android 设备上,我遇到了以下问题:
我有一个位于屏幕下方 50% 的输入 Web 控件文本框。当焦点转到文本框时,显示软键盘并遮盖/覆盖/隐藏用户应该输入的输入 Web 控件。只有当用户输入至少一个字符时,输入 Web 控件才会变得可见并且不再隐藏在键盘下方。
我想要的是输入的字段不会被键盘遮挡。当显示软键盘时,我希望输入 Web 控件保持可见。
这是在运行 Android 3.2 版的三星平板电脑上。
请告诉我如何做到这一点。
【问题讨论】:
这听起来像是旧版 Android 浏览器中的错误。除非可以使用某些现代用户代理复制此问题,否则应删除或关闭此问题。 【参考方案1】:解决这个 android(现在也是 ios7)讨厌的最简单方法是使用输入焦点和模糊事件。如果您没有将页脚标记更改为类。
在 jQuery 中:
$("input").focus(function()
$('footer').hide();
);
$("input").blur(function()
$('footer').show();
);
【讨论】:
任何解释你的代码应该做什么?为什么隐藏任何组件时输入会变得可见?以上是关于Android移动应用中的焦点分析的主要内容,如果未能解决你的问题,请参考以下文章
Android 软键盘隐藏了移动 HTML5 网络应用程序中的输入字段
如何在 tvos 应用程序的 collectionview 单元格中的按钮上移动焦点?
Android TV 在 RecyclerViews 之间移动焦点
Vue全家桶开发Android和IOS移动端应用常见问题解决