感谢分享 http://www.7po.com/thread-564068-1-1.html


第一种方法:

采用Android自带的直接控制焦点上下左右的方法。这种方法的前提是必须知道每个view的id,因此在进行布局时有必须要通过view.setId(…)指定view的特定ID,然后通过view.setNextLeftView(…)等四个方法控制该view的上下左右移动后所到达的view。

第二种方法:

在一些比较复杂的Layout中,特别是涉及到在View的焦点变化的过程中还要控制view的背景以及字体颜色变化等。

比如:在有多个Layout(假设有Layout1, Layout2, Layout3,每个Layout中都有若干个ImageButton),

当你从Layout1中的某个ImageButton 1.1中移动Layout2中ImageButton 2.1,此时ImageButton 1.1要标识为被选中,但是失去焦点,此时ImageButton 2.1是选中并且获取焦点,再从ImageButton 2.1移到ImageButton 3.1的过程中也是这种情况。

对于这样一种情况,你必须对每个ImageButton 设置焦点捕获实际(setOnFocusChangeListener),在该监听事件中处理,

(注:下面代码即兴写的,大概就是这个意思 –^_^– )


  1. ImageButton.setOnFocusChangeListener(){ 
  2.           public void onFocus(boolean Focus){ 7 }8 a7 c5 d  Z# Q) \  M. s1 s
  3.                    if( Focus ){
  4.                     // ImageButton 2.1 获焦时, ImageButton 2.1 改变获取焦点背景, ImageButton 1.1也改变失去焦点背景 / \$ l0 |0 j% ]8 c. T7 h
  5.                      } else{
  6.                      //  ImageButton 2.1 获焦时,  ImageButton 2.1 改变失去焦点背景 ,  ImageButton 3.1也改变获取焦点背景  3 H* l9 C+ n  y( c- Q& L$ e/ c8 o
  7.          }# r7 ^9 W1 ]; L( h& W7 E( u& Z

  8.               }% x1 S2 E4 W. e" J* ]4 \  `
  9.   }
复制代码

还有就是当你当前焦点移动到ImageButton 3.1上时,你有时需要知道此时Layout1、Layout2上是哪个ImageButton 被选中,因此你还必须设置三个ImageButton 变量(标识选中哪个布局中的那个ImageButton 对象),和三个int变量(标识选中哪个布局中的第几个)。

通过这些标识,你就可以很方便的了解到那个聚焦和哪个失去焦点了。

对于进行上下左右的控制,此时就要在OnKeyDown事件中进行捕获处理了。由于事先已经知道是哪个Layout中的哪ImageButton被选中了,而此时你进行上下左右操作是在你被选中的View上进行操作的,因此在OnKeyDown中你只需先判断是哪个View被选中,然后根据按键事件来移动View(通过之前设置的int标识进行移动)

(注:由于是即兴写的,可能部分代码有错误,这里只是描述这个意思,–^_^–)

假设Layout1中被选中的ImageButton为mFirstImgBtn, 序号为mFirstIndx;

Layout3中被选中的ImageButton为mThirdImgBtn, 序号为mThirdIndx;

每个Layout里面的ImageButton均在一个数组中,
假设分别为:ImageButton mImgBtnArray1[], mImgBtnArray2[], mImgBtnArray3[]

  1. 当前被选中的view为   mSenondImgBtn' |( j: b7 U( w8 S$ k  O+ p

  2.        public void OnKeyDown(int keyCode, KeyEvent event){

  3.                     if( event.KEYCODE_DROP_UP== keyCode ){  //如果按下的是上键- i' D' Y0 J1 S. c

  4.                             mImgBtnArray1[ThirdIndx ].requestFocus;- j( T" B" f* S5 l; A2 }

  5.                      }. Y  _( R5 ?9 D

  6.                     if( event.KEYCODE_DROP_DOWN == keyCode ){  //如果按下的是下键% |( u! c* ^+ z: ^5 |) O* u5 y

  7.                               mImgBtnArray3[ ThirdIndx ].requestFocus;

  8.                      }

  9.                     if( event.KEYCODE_DROP_LEFT == keyCode ){  //如果按下的是左键: E# o& k( N, Z2 ^+ c3 s
  10. 1 d3 p8 @+ h' y, F
  11.                               mImgBtnArray1[ ThirdIndx-1 ].requestFocus;

  12.                      }

  13.                     if( event.KEYCODE_DROP_RIGHT == keyCode ){  //如果按下的是右键
  14. 9 N9 S' ?# f( f+ W: g: Z
  15.                                mImgBtnArray1[ ThirdIndx+1 ].requestFocus; + ~* E# u  t$ A* X/ {2 Q0 p, ]' v
  16. # f. W! c6 y5 w$ n; }
  17.                      }. J/ W' R' ]# Q( n

  18.        }8 R& M. W3 ~7 E- y- [
复制代码 6 |9 `- i+ p+ D% w; i( C
而具体的获焦事件处理则在每个View的 OnFocusChangeListener 事件中处理。

更多相关文章

  1. Android TV 焦点原理源码解析
  2. Android 如何使EditText不自动获取焦点
  3. 微软发布 mircosft remote desktop for android
  4. android软键盘的隐藏以及Edittext的焦点问题
  5. Android连接SQLServer详细教程(数据库+服务器+客户端),并在微软Azur
  6. Android之requestFocus焦点移动问题
  7. 专利敲诈——微软对Android痛下杀手的背后
  8. Android EditText获取焦点事件

随机推荐

  1. 1. php变量的8种数据类型? 2. php变量类型
  2. php遍历数组与js遍历数组的区别
  3. markdown基本语法
  4. 字符串函数
  5. three.js 入门详解(一)
  6. <JVM中篇:字节码与类的加载篇>01-Class字节
  7. Flutter高级进阶实战 仿哔哩哔哩APP
  8. 0629作业
  9. <JVM下篇:性能监控与调优篇>01-概述篇-02-
  10. 传统架构云化后的运维,维护的是什么?