AndroidTV焦点问题总结

焦点

1.确定当前焦点位置

在一些复杂的View中,频繁按遥控器,焦点丢失,可以通过如下方法获取全局焦点所在的View

ViewTreeObserver viewTreeObserver = getWindow().getDecorView().getViewTreeObserver();
        viewTreeObserver.addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() {
            @Override
            public void onGlobalFocusChanged(View oldFocus, View newFocus) {
                Log.d(TAG, "oldFocus========" + oldFocus  + "newFocus============" + newFocus);
            }
        });

2.子view焦点跟随父View变化

父View是一个ViewGroup,有焦点时背景变化,子View是一个TextView有焦点时字体颜色变化

android:duplicateParentState="true" 

3.设置下一个获取焦点的View

android:nextFocusDown="@id/view1"
android:nextFocusUp="@id/view2"
android:nextFocusLeft="@id/view3"
android:nextFocusRight="@id/view4"

4.设置父View和子View哪个获取焦点

使用descendantFocusability属性

  • beforeDescendants :viewGroup会优先其子类控件而获取到焦点
  • afterDescendants :viewGroup只有当其子类控件不需要获取焦点时才获取焦点
  • blocksDescendants :viewGroup会覆盖子类控件而直接获得焦点

5.常用的按键值

KEYCODE_BACK 4返回

KEYCODE_DPAD_DOWN 20

KEYCODE_DPAD_UP  19

KEYCODE_DPAD_LEFT 21

KEYCODE_DPAD_RIGHT 22

KEYCODE_ENTER = 66;

KEYCODE_MEDIA_REWIND  快退

KEYCODE_MEDIA_FAST_FORWARD 快进

KEYCODE_VOLUME_DOWN = 25;

KEYCODE_VOLUME_MUTE = 164;

KEYCODE_VOLUME_UP = 24;

7.控制RecycleView焦点跳转逻辑

例 item最后一行未满,倒数第二行DOWN需要跳转下一行

参考文章跳转逻辑逻辑修改

8.其他View焦点跳转到RecyclerView

  1. RecyclerView第一次获得焦点,默认选中第一项
  2. RecyclerView重新获得焦点后,选中上次的item

Android系统的焦点跳转规则是就近跳转,以上两点可能无法满足。使用HorizontalGridView或者VerticalGridView则可以解决以上两点问题。

9.ViewGroup的某个子View获取焦点

handler.postDelayed(() -> {
            View child = videoPlayerHolder.ctrlInfoList.getChildAt(0);
            View list = child == null ? null : ((LinearLayout) child).getChildAt(1);
            View item = list == null ? null : ((HorizontalGridView) list).getChildAt(currentIndex);
            if (child == null || list == null) {
                videoPlayerHolder.ctrlInfoList.requestFocus();
            } else {
                if (item == null) {
                    list.requestFocus();
                } else {
                    item.requestFocus();
                }
            }
        }, 50);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
声明:这些内容是逐步总结过来的,所以可能有当时的理解不正确,只希望大家能做个参考: 内容如下: 目录 一句话总结汇总: Copy project into workspace 和add project into work set 的含义 数字签名总结 JNI 基础及注意: Ndk的使用方法: Ant 与 android update project 命令行只有在非根盘符上才能运行 android Launcher Android 运行环境搭建 Android:name什么时候加”.” Activity class {package/class} does not exist 问题的解决 Activity 中两次调用OnCreate的原因 ByteBuffer 和 FloatBuffer 的直接分配和非直接分配 Application的使用小总结 “call to OpenGL ES API with no current context (logged once per thread” 问题的解决 2013年9月7日19:15:33:我的平板分辨率很高可是运行public void onSurfaceChanged(GL10 gl, int width, int height)函数时,分辨率只有 455*320,这是为什么? 关于android添加第三方字体的方法 android-apt-compiler: [t1] res\layout\LinearLayout.xml: Invalid file name: must contain only [a-z0-9_.] Buttons in button bars should be borderless android 支持的距离单位 使用adb shell命令进入手机后使用ls命令提示: opendir failed permission denied 使用adb pull 命令提示permission denied Button 中的setLayoutParams使用注意: layout文件夹和raw文件下面的文件读取 Matrix方法中的set方法和post方法 android 中调用drawBitmap时理解dip(屏幕密度)和px(像素)的区别 SQLiteDatabase 的setTransactionSuccessful作用 终于弄明白 paddingleft margineleft layout_gravity 和gravity之间的区别 自定义控件时要注意的问题。 obtainMessage 的作用: FrameLayout 需要注意的地方: EditText 禁止弹出按键盘: 获取控件屏幕位置和窗口位置: 为什么MyAdapater的getView没有被调用 XmlSerializer使用总结: ListView中的Item自定义点击后的背景色的方法。 drawable各个分辨率 fragment 的几种创建方式 fragment第一次使用遇到的问题 activity变身对话框 onMeasure 中的AT_MOST EXACTLY UNSPECIFIED MotionEvent的触发记录 对于Drawable 的 getIntrinsicHeight 和getIntrinsicWidth的理解 IntentService 使用总结: 文件读写总结: AES 解密失败: XML中的include标签加入后崩溃 Button的background标签使图像拉伸的问题 SharedPreferences 的getString 的陷阱 TextView 中的EMS和Maxlength

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值