private void setListViewPos(int pos) {
if (androidosBuildVERSIONSDK_INT >= 8) {
mListViewsmoothScrollToPosition(pos);
} else {
mListViewsetSelection(pos);
}
}
点选某个item时记录下他在listView中的位置,然后用上面这个方法就可以直接让listView滚动到这一行。
>
ListView lv =(ListView)findViewById(RidXXXX);lvsetAdapter(Adatper);在adapter中的getView,ImageView iv 是你要的imageview的话,加上ivsetFocusable(true);ivsetFocusableInTouchmode(true);要动态设置焦点,就用viewrequestFocus()函数实现。。我没有环境,可能拼写的不对,希望帮到你。
之前遇到过这种情况,参考如下内容: xml布局文件中RecyclerView和Item的高度都设定的是wrap_content,那说好的自适应于item高度呢?查看Android文档,没发现有关RecyclerView高度相关说明,看来只能自己动手丰衣足食了。
简单一点理解,在移动应用中,焦点就是当前正在处理事件的位置。在手机应用中,最有可能用到焦点的就是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方法。
第一种方式,代码设置,注意先后顺序: btnsetFocusable(true);btnsetFocusableInTouchMode(true);btnrequestFocus();btnrequestFocusFromTouch();
2 第二种方式,xml配置: android:focusable="true
Android TV app开发与一般Android开发最大的区别在于焦点控制 , 用户在使用Android TV设备主要是通过遥控器 *** 作app。机顶盒应用不同于手机应用,因为多数是没有触摸屏的,只能靠遥控器,所以要保持一个焦点的位置,让用户知道当前 *** 作作用的对象。 然而一些app,依据系统对focus的判断,会出现的状况: 上下导航时,不是想要的结果。 边缘移动时,会出现焦点丢失的状况。 有时想直接定位到某个位置上。
android提供了一些焦点相关的属性,在现有的框架层下通过设置View的属性来获得焦点
android:focusable:设置一个控件能否获得焦点
android:background:设置在作为背景的drawable
android:nextFocusDown:定义下一个获得焦点的控件当按下键时
android:nextFocusUp:定义下一个获得焦点的控件当按上键时
android:nextFocusLeft:定义下一个获得焦点的控件当按左键时
android:nextFocusRight:定义下一个获得焦点的控件当按右键时
<requestFocus/>:强制设置一个焦点到指定的view或它的一个子类,前提是android:focusable为true能够获得焦点
gallery 里面添加gridview(gridview一屏能显示完所以不需要滚动)
在gridview的OnTouchListener里面判断单击还是滚动,如果是滚动的话,把MotionEvent的一些参数传给gallery的OnTouchEvent,就变成gallery在滚动了
以上就是关于android listview获取焦点的item一直在屏幕的最前,怎么处理。全部的内容,包括:android listview获取焦点的item一直在屏幕的最前,怎么处理。、android tv常见问题(四)焦点变化时,Recyclerview是如何进行滚动的、android tv 怎么修改主题使listview获取焦点的背景为蓝色等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)