本文记录作者自己在开发Android TV应用的时候遇到的问题并记录之,供后续查漏补缺。
一般系统的自带控件focusable 的值,有 button及其子类RadioButton、CheckedBox , EditText,还有ListView,Recycleiew 等列表类控件为true, 其余的都为false。
View[] viewFocusable = new View[]{mButton, mLinearLayout, mImageView, mImageButton, mView, mTextView, mEditText, frameLayout ,relativeLayout};for (View v: viewFocusable) {Log.d(TAG, v.toString() + "focusable 的值为:" + v.isFocusable());}打印的值为:android.support.v7.widget.AppCompatButton{4221f9d8 VFED..C. ......I. 0,0-0,0 #7f090043 app:id/btn}focusable 的值为:true
android.widget.LinearLayout{ ......I. 0,0-0,0 #7f0900db app:id/llayout}focusable 的值为:true
android.support.v7.widget.AppCompatImageView{421f5280 ......I. 0,0-0,0 #7f0900aa app:id/imageView}focusable 的值为:false
android.support.v7.widget.AppCompatImageButton{41fe4670 VFED..C. ......I. 0,0-0,0 #7f0900a9 app:id/imageButton}focusable 的值为:true
android.view.View{421d7400 ......I. 0,0-0,0 #7f090150 app:id/view}focusable 的值为:false
android.support.v7.widget.AppCompatTextView{4221b9b0 ......ID 0,0-0,0 #7f09014a app:id/tv}focusable 的值为:false
android.support.v7.widget.AppCompatEditText{42222650 VFED..CL ......I. 0,0-0,0 #7f090079 app:id/et}focusable 的值为:true
android.widget.FrameLayout{421e12f0 ......I. 0,0-0,0 #7f090084 app:id/frameLayout}focusable 的值为:false
android.widget.RelativeLayout{41fe4f90 ......I. 0,0-0,0 #7f09010c app:id/rlLayout}focusable 的值为:false
针对第二个linearLayout 的值为 true, 是因为在xml中 设置focusable = true 导致的。一般的,容器控件的view 其 focusable 都为 false,除非你设置了。
那针对ListView、recycleView这种控件呢, 以及他们的Item 呢?
答案是他们默认是True, 他们和一般容器控件不一样 。以ListView为例,体统源码中有设置:setFocusableInTouchMode(true);
同理recycleView也都一样。而对于item而言,我们需要进行设置
private boolean mItemsCanFocus = false;/*** Indicates that the views created by the ListAdapter can contain focusable* items.** @param itemsCanFocus true if items can get focus, false otherwise*/public void setItemsCanFocus(boolean itemsCanFocus) {mItemsCanFocus = itemsCanFocus;if (!itemsCanFocus) {setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);}}/*** @return Whether the views created by the ListAdapter can contain focusable* items.*/public boolean getItemsCanFocus() {return mItemsCanFocus;}
上面是ListView中关于item能否聚焦的核心代码,一看就明了。而RecycleView 对于item而言,则需要在
@Overridepublic void onBindViewHolder(@NonNull final Holder holder, int i) {//设置item 可以点击holder.itemView.setFocusable(true);holder.itemView.setFocusableInTouchMode(true);}
一般来说:系统会自动的把焦点移到距离最近的可触控的控件(focusable为true),所以当我们在一个viewGroup (没有进行特殊设置)包裹了一个可以的点击的Button,这时候他会自动的把焦点聚焦在button上,如果你对ViewGroup 进行设置可聚焦,那么焦点会获取焦点,button就无法聚焦,除非你对viewGroup 进行 onFocusableChangeListener监听,并让button 强制获取焦点
v.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View v, boolean hasFocus) {if(hasFocus){Log.d(TAG, "onFocusChange: hasFocus" + v.toString());// do something}else {// do somethingLog.d(TAG, "onFocusChange: lostFocus" + v.toString());}}});
本文发布于:2024-02-04 13:31:55,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170708389256012.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |