android开发中,那些年关于焦点返回的那些事

来源:互联网 发布:中银淘宝卡注销 编辑:程序博客网 时间:2024/05/18 02:01

不知在开发过程中,有没有遇到以下这么个问题:

前提:这少三级页面A,B,C

      点击A页面中的按钮(A_btn)事件,焦点转移到B页面上的某个控件(B_btn)上,然后在点B页面上(B_btn)按钮,跳转到C页面控件(C_btn)上,此时,你希望监听C_btn的返回键事件,并让他先返回到B_btn,然后在监听B_btn的返回事件,按返回键回到A_btn。

问题:

    可是实现是可悲的,经过编写,发现在C_btn上监听返回键,按返回键时焦点一下子就回到了A_btn上。

细节:

    其实在按返回键的时候,焦点从C_btn上回到A_btn上时,中间经过B_btn了;

原因:

    经过Log打印测试,发现,在C_btn跳到B_btn上时,在KEYCODE_BACK时按下键(DOWN)就已经回到B_btn,但是在松开键,即(UP)时却触发了B_btn的返回事件,从而导致刚才情况的出现。

现象发生原因:

    这个我也不太清楚,烦请看见的大神,若有知道的,万请告知,九易阳万分感谢。

解决:

    当然,这个问题,经过思考,解决了,而且,办法还很多,现就将我认为最可靠的一种办法,拿出来,和大家讨论讨论。

    首先,注册B_btn 的返回事件:

       B_btn.setOnKeyListener(new KeyListenerBtn());

    然后注册C_btn的返回事件:

       C_btn.setOnKeyListener(new RightTitleLister());  

    现就以上两个类加以实现:

   
 final class KeyListenerBtn implements OnKeyListener{  
  
  @Override
  public boolean onKey(View view, int keyCode, KeyEvent event) {
   boolean flag = true;  
   switch (keyCode)
           
             case KeyEvent.KEYCODE_BACK:
                           
              if(view.getId() == B_btn.getId()){
               if(event.getAction() == KeyEvent.ACTION_UP){
                flag = false;
                            
                                          
              if(flag){

               A_btn.requestFocus();
               A_btn.requestFocusFromTouch();
               A_btn.setFocusableInTouchMode(true); 
              }
                 return true;
             default:
     break;
         }
   return false;
  }
  
 }

 

 

    final class RightTitleLister implements OnKeyListener{

  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) { 

   switch (keyCode)
           
             case KeyEvent.KEYCODE_BACK: 

              //加载C页面                      
               A_btn.setFocusable(false);
               B_btn.setFocusable(true);
               B_btn_btn.requestFocus();

               return true;
             default:
     break;
         }
   return false;
  }
  
 }

 

 在B_btn的返回事件中让抬起监听事件无效,这就在C_btn返回B_btn的时候触发不了B_btn的返回事件,解决OK

 

若文章中有误,万请留言告知,九易阳诚谢。