天天看點

關于可編輯輸入框的focus設定

最近在開發當中遇到一種需求,要根據某些條件來對WebView彈出鍵盤與否進行控制,本來想使用setFocusable(false)和setFocuseable(true)來控制,但是發現取消焦點再設定焦點後控件的焦點一閃就消失了。

然後找到了一位同學說用setFocusableInTouchMode可以解決類似問題,ps:他是解決edittext的。

我試了一下果然可以通用。下面就是他的代碼:

public class TestInputActivity extends Activity {    

    int index = ;  
    EditText et;  
    int inType;  
    Handler handler = new Handler(new Handler.Callback() {  

        @Override  
        public boolean handleMessage(Message msg) {  
            et.setFocusableInTouchMode(true);  
            et.setSelection();  
            return false;  
        }  
    });  

    @Override    
    public void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.main);  

        et = (EditText) findViewById(R.id.et);  
        et.setFocusableInTouchMode(false);  
        et.setOnClickListener(new OnClickListener() {  

            @Override  
            public void onClick(View v) {  
                if(index == ){  
                    inType = et.getInputType(); // backup the input type    
                    et.setInputType(); // disable soft input   
                    et.setFocusableInTouchMode(false);  
                    et.clearFocus();  
                    index = ;  
                }else if(index == ){  
                    et.setInputType(inType); // restore input type       
                    et.setFocusableInTouchMode(true);  
                    et.requestFocus();  
                    index = ;  
                }  
            }  
        });  
    }    
}    
           

基本上遊戲到這裡就結束了,然後這位同學并沒有告知原理,我感到十分不開心。就順便搜了一下。然後,還是度娘比較給力:

Android的Touch Mode

大多數Android裝置都是觸摸屏的,但是實際上Android裝置也支援鍵盤操作,允許通過鍵盤來完成導航,點選,輸入等。

  當使用者通過鍵盤(或者軌迹球)操作的時候,有必要聚焦目前接受輸入的UI元素,例如,高亮(聚焦)某個按鈕,讓使用者知道目前正在操作的UI元素是哪個。

  但是,當使用者使用觸摸屏與裝置互動的時候,始終聚焦目前UI元素就沒有必要了,而且很醜陋;使用者點選哪個元素,哪個元素就是目前元素,無需高亮辨別。并且,通過觸摸屏與裝置互動的時候,點選某個UI元素也不會導緻該元素聚焦,此時的高亮效果是由Pressed狀态來完成的。也就是說,在Touch Mode模式之下,UI元素是不會進入聚焦狀态的,即使調用requestFocus也不會。

  那個,Android是如何區分這兩種情況的呢?

  答案就是Touch Mode。當使用者開始通過鍵盤與裝置互動的時候,裝置就退出Touch Mode模式;當使用者開始通過觸摸屏與裝置互動的時候,裝置就進入Touch Mode模式。可以通過調用View的isInTouchMode來判斷裝置目前是否處于Touch Mode模式。

  但是,也有例外情況。有些UI元素,即使是在Touch Mode的狀态之下,也需要獲得焦點,典型的就是Edittext。那麼,這種情況該如何處理呢?

  答案就是做特殊處理。Android規定,某些元素,即使是在Touch Mode模式下,也可以獲得焦點。調用View的setFocusableInTouchMode(true)可以使View在Touch Mode模式之下仍然可獲得焦點(像Edittext就是在内部設定了這個屬性),調用isFocusableInTouchMode可以判斷View是否可在Touch Mode模式下聚焦。