android 焦点问题

 

今天解决了一个Android平台下的焦点问题。发现其中关键问题的所在是Android的touchMode。从JavaSwing平台过来的人,都会关注setFocusable()和requestFocus()方法,但是在Android的View中还有另外的两个个方法,setFocusableInTouchMode()和requestFocusFromTouch()方法。这个两个方法就是解决Android上的焦点获取问题的关键。


同时在View类中,还有一个isInTouchMode(),可以帮助我们在监听Focuse事件时判断是否执行click(). 代码如下:

复制到剪贴板  XML/HTML代码
  1. ImageButton.OnFocusChangeListener mFocusChangeListener = new ImageButton.OnFocusChangeListener(){  
  2.       
  3.     public void onFocusChange(View v, boolean hasFocus) {  
  4.         Log.d("FocuseChange", "Focuse has changed.");  
  5.           if (hasFocus) {  
  6.                    // 如果是touchmode就执行click,否则就会只是选中。   
  7.               v.setBackgroundDrawable(getResources().getDrawable(R.drawable.));  
  8.               if (v.isInTouchMode()){  
  9.                   ((ImageButton)v).performClick();  
  10.               }   
  11.           } else {  
  12.               v.setBackgroundDrawable(getResources().getDrawable(R.));  
  13.               v.getBackground().setAlpha(100);  
  14.           }  
  15.           
  16.     }  
  17. };  

 

系统框架将处理日常的焦点移动来响应用户的输入,它包刮改变焦点(当界面是被移除,隐藏,或者作为一个新的View变为可用状态),通过isFocusable()这个方法我们可以知道view是否具有接受焦点的资格,也可以通过setFocusable().来设置view接受焦点的资格,对应在触摸模式下,你可以调用isFocusableInTouchMode().来获知是否有焦点来响应点触,也可以通过setFocusableInTouchMode().来设置是否有焦点来响应点触的资格.
系统框架控制焦点移动到另一个组件的算法是在某一方向上邻近的组件,在极个别情况下,默认的算法可能不符合开发者的预想要求,在这种情况下,你可以覆写下列XML属性的布局文件:nextFocusDownnextFocusLeftnextFocusRight ,和nextFocusUp设置他们的值来明确焦点从当前界面移动下个界面的Id。例如: 

android:orientation="vertical"

... >

你可能感兴趣的:(android 焦点问题)