Android中EditText焦點問題

來源:互聯網
上載者:User

標籤:man   chm   number   美的   android中   input   word   cat   meta   

https://www.jianshu.com/p/3d31d681f4bc

 

 

問題:當EditText失去焦點時做內容校正

情境:使用者編輯EditText將內容清空,當點擊空白地方時關閉軟鍵盤,同時校正EditText的內容,如果為空白則設為"1"。
問題遠沒有看著那麼簡單哦

第一步:添加焦點監聽
view.setOnFocusChangeListener(new OnFocusChangeListener() {            @Override            public void onFocusChange(View v, boolean hasFocus) {                if(!hasFocus){                    Log.d("Tag","lose focus");                    if(TextUtils.isEmpty(((EditText)v).getText().toString().trim())){                        view.setText("1");                    }                }else {                    Log.d("Tag","get focus");                }            }        });
第二步:點擊空白地方時關閉軟鍵盤

在Activity中使用以下代碼:

 @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN) {            View v = getCurrentFocus();            if (isShouldHideInput(v, ev)) {                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);                if (imm != null) {                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);                }            }            return super.dispatchTouchEvent(ev);        }        // 必不可少,否則所有的組件都不會有TouchEvent了        if (getWindow().superDispatchTouchEvent(ev)) {            return true;        }        return onTouchEvent(ev);    }    public boolean isShouldHideInput(View v, MotionEvent event) {        if (v != null && (v instanceof EditText)) {            int[] leftTop = {0, 0};            //擷取輸入框當前的location位置            v.getLocationInWindow(leftTop);            int left = leftTop[0];            int top = leftTop[1];            int bottom = top + v.getHeight();            int right = left + v.getWidth();            if (event.getX() > left && event.getX() < right                    && event.getY() > top && event.getY() < bottom) {                // 點擊的是輸入框地區,保留點擊EditText的事件                return false;            } else {                //使EditText觸發一次失去焦時間點事件                v.setFocusable(false);//                v.setFocusable(true); //這裡不需要是因為下面一句代碼會同時實現這個功能                v.setFocusableInTouchMode(true);                return true;            }        }        return false;    }

加入以上代碼你驚喜的發現問題貌似完美的解決了。但是,如果你的介面中有多個EditText,你會發現當點擊第一個EditText時,第二個EditText會有游標閃以下,或者點擊第二個或者之後的EditText,第一個EditText會有游標閃一下。通過Log你會發現從第二次點擊EditText起,每次點擊EditText都會先觸發一次失去焦點,再觸發一次擷取焦點。由此可以推斷當存在多個EditText時,一個EditText失去焦點會觸發另一個擷取焦點。這問題必須解決,而且出現螢幕游標閃動影響使用者體驗。

第三步:避免另一個EditText擷取焦點

解決這個問題的做法是在同一個XML中將一個不會有響應的控制項(如TextView)設定如下屬性:

android:focusable="true"android:focusableInTouchMode="true"


會飛的大象
連結:https://www.jianshu.com/p/3d31d681f4bc
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

Android中EditText焦點問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.