本文主要说的就是在TV开发中常遇到的问题总结

焦点丢失问题

在使用ListView、GridView及RecyclerView时有时会出现,这时需要在xml中,添加

android:descendantFocusability="afterDescendants"

这里会有三种方式分别为

  • beforeDescendants:viewgroup会优先其子类控件而获取到焦点

  • afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点

  • blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

在使用自定义组合控件是可以用代码设置,如下

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);

控件调用bringToFront失效,导致焦点错乱问题

源码中:

  • View

      public void bringToFront() {      if (mParent != null) {          mParent.bringChildToFront(this); // 是调用父布局的 bringChildToFront      }  }
  • ViewGroup

      @Override  public void bringChildToFront(View child) {      final int index = indexOfChild(child);      if (index >= 0) {          removeFromArray(index); // 删除子控件数组位置.          addInArray(child, mChildrenCount); // 添加子控件到队尾.          child.mParent = this;          requestLayout();          invalidate();      }  }
  • 所以可以将你要置顶的子控件和最后一个要绘制的控件交换位置, 因为最后绘制的子控件是在最上面的。

      setChildrenDrawingOrderEnabled(true)  @Override  protected int getChildDrawingOrder(int childCount, int i) {      if (position != -1) {          if (i == childCount - 1)          return position;      if (i == position)           return childCount - 1;      }      return i;  }
  • ViewUtil

      public class ViewUtil {      private final ViewGroup viewGroup;      private int position;        public ViewUtil(ViewGroup group) {          this.viewGroup = group;      }        public void bringChildToFront(ViewGroup vg, View child) {          position = vg.indexOfChild(child);          if (position != -1) {              vg.postInvalidate();          }      }        public void bringChildToFront(View child) {          if (viewGroup == null) {              return;          }          position = viewGroup.indexOfChild(child);          if (position != -1) {              viewGroup.postInvalidate();          }      }        public int getChildDrawingOrder(int childCount, int i) {          if (position != -1) {              if (i == childCount - 1)                  return position;              if (i == position)                  return childCount - 1;          }          return i;      }  }
  • 在Android5.0以后可以通设置控件的Z坐标达到相同的效果

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {      ViewCompat.setElevation(view, 1);  } else {      if (view.getParent() instanceof BringChildLinearLayout) {          BringChildLinearLayout layout = (BringChildLinearLayout) view.getParent();          layout.bringChildToFront(view);      }  }

跑马灯失效

  • 自定义TextView实现跑马灯时,设置单行时用“maxLines=1”不生效,应该使用“singleLine=true”(过期的API)。

更多相关文章

  1. android Chronometer 时间计时控件 简单介绍
  2. Android(安卓)FrameWork——Touch事件派发过程详解
  3. Android控件之ScrollView(scrollbarStyle)
  4. Android在代码中设置控件的drawableLeft等
  5. Android(安卓)多线程:手把手教你使用AsyncTask
  6. 自定义布局RelativeLayout 画网格线
  7. android 随笔记录1
  8. Android(安卓)在OnCreate获取需要控件的高度,宽度,textview的行数
  9. 关于自定义控件和属性时TypedArray.getDimension应当注意的问题

随机推荐

  1. Android(安卓)RIL 架构
  2. ADT后在windows菜单下找不到Android(安卓
  3. android客户端控制树莓派GPIO点亮LED灯
  4. Android(安卓)4.4 (KitKat) SMS Apis Cha
  5. android实现向右滑动返回功能
  6. Android的init过程(二):初始化语言(init.rc)解
  7. 深入剖析Android消息机制
  8. Android(安卓)应用程序消息处理机制(Loope
  9. Android中数据存储——SQLite数据库存储
  10. Qt for Android获取手机序列号/手机型号/