【Code-Snippet】EditView

1 .替換Hint的Focused顏色

使用: android:textColorHint="@drawable/edittext_hintcolor_selector"去指定: 那麼,咱們的XML文件以下:php

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="false" android:color="#8d9fa8"/>
    <item android:state_focused="true" android:color="#00cbfe"/>
</selector>
複製代碼

2 .替換下劃線的顏色

使用: android:background="@drawable/edit_msg_dialog_bg"去替換: 這裏給出一個例子:html

  • edit_msg_dialog_bg.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/line_et_focus"/>
    <item android:drawable="@drawable/line_et_normal"/>
</selector>
複製代碼

上面的bg指定了Focused的時候的樣式:java

  • line_et_focus.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
    <item android:left="-2dip" android:right="-2dip" android:top="-2dip">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke android:width="1dip" android:color="@android:color/holo_green_light" android:dashGap="0dp" android:dashWidth="0dip" />
        </shape>
    </item>
</layer-list>
複製代碼
  • line_et_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
    <item android:left="-2dip" android:right="-2dip" android:top="-2dip">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke android:width="1dip" android:color="#cecece" android:dashGap="0dp" android:dashWidth="0dip" />
        </shape>
    </item>
</layer-list>
複製代碼

3. 文字變化監聽

使用TextWatcher監聽EditText變化android

/** * 監聽EditText框中的變化 */
mEditText.addTextChangedListener(new TextWatcher() {
    private CharSequence temp;
    private int editStart;
    private int editEnd;

    /** * 在字符串s內,從索引爲start(包含)的字符開始的count個字 * 符將被長度爲after的新文本代替 * @param s * @param start * @param count * @param after */
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        temp = s;
    }

    /** * 在字符串s內,從索引爲start(包含)的字符開始count個字符 * 剛剛替換了長度爲before的舊字符 * @param s * @param start * @param before * @param count */
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        mTextView.setText("輸入的結果爲:"+s);
    }

    /** * 字符串s內容已經發生了變化.能夠在這一步對s進行合理的變動,可是要注意不要進入 *無限循環,由於字符串的任何變化都會再次遞歸調用此回調方法.在這個方法中不會告 * 訴 你字符串哪些內容發生了變化,由於其餘針對字符串的改變已經調用了 * afterTextChanged().若是你想知道哪些發生了變化,能夠在 * onTextChanged(CharSequence, int, int, int)使用setSpan(Object, int, int, int) * @param s */
    @Override
    public void afterTextChanged(Editable s) {
        editStart = mEditText.getSelectionStart();
        editEnd = mEditText.getSelectionEnd();
        if (temp.length() > 10) {//限制長度
            Toast.makeText(MainActivity.this,"輸入的字數已經超過了限制!", 
                Toast.LENGTH_SHORT).show();
            s.delete(editStart - 1, editEnd);
            int tempSelection = editStart;
            mEditText.setText(s);
            mEditText.setSelection(tempSelection);
        }
    }
});
複製代碼

4.EditText在界面初始化後,不自動獲取焦點

使EditText不自動獲取焦點,拿到光標git

Android中Activity中某個EditText被clearFocus後其餘控件(別的EditText)也不要得到焦點github

一樣的問題:Android中Activity中某個EditText被clearFocus後其餘控件(別的EditText),會自動獲取到焦點,此時也能夠用如下的方法解決。在佈局的最外層,頂級父佈局中,設置:數組

android:focusable="true"
android:focusableInTouchMode="true"
複製代碼

這樣,就把EditText默認的行爲截斷了!在未點擊Edittext前,EditText不會顯示光標bash

5.EditText光標移動到文本框末尾

EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
複製代碼

6. 限制輸入的字符

如何限制只能輸入指定的字符
設置 android:digits 屬性便可

android:digits = "abcdef"
限制只能輸入:abcdef

android:digits="1234567890"
限制只能輸入數字
複製代碼

7. 每N位數字插入空格

這裏以手機號爲例,每使用空格分隔成,3,4,4的樣子,相似:130 1234 5678 的樣子,手機號碼爲11位,可是由於有特殊字符(代碼中將空格替換爲想要的字符)或者空格,因此EditText的 android:maxLength="13" 屬性要設置爲大於11,個人因爲存在兩個空格,因此設置最大爲13。ide

android:digits="1234567890"<!--只容許輸入這10個數字-->
複製代碼
private boolean flagIsDeletePhoneEt = false;
etPhone.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        int length = s.toString().length();
        //刪除數字
        if (count == 0) {
            flagIsDeletePhoneEt = true;
        }
        //添加數字
        if (count == 1) {
            if (length == 4) {
                String part1 = s.subSequence(0, 3).toString();
                String part2 = s.subSequence(3, length).toString();
                etPhone.setText(part1 + " " + part2);
            }
            if (length==9){
                String part1 = s.subSequence(0, 8).toString();
                String part2 = s.subSequence(8, length).toString();
                etPhone.setText(part1 + " " + part2);
            }
            flagIsDeletePhoneEt = false;
        }
    }
    @Override
    public void afterTextChanged(Editable s) {
        //將光標移動到末尾
        if (!flagIsDeletePhoneEt)
            etPhone.setSelection(etPhone.getText().toString().length());
        checkIsFullWrite(btnLogin,etPhone,etVerificationCode);
    }
});
複製代碼

雖然效果作出來了,可是當咱們調用etPhone.getText().toString()方法時, 你會發現獲得的結果裏也是包含空格或者特殊字符的一串號碼。若是想要純 數字的結果,那麼就須要對結果進行一下處理:工具

//從EditText獲取的字符串
String phoneNum=etPhone.getText().toString();
//純數字字符串
String number=formatPhoneNum(phoneNum);

    /** * 去掉手機號內除數字外的全部字符 * * @param phoneNum 手機號 * @return */
    private String formatPhoneNum(String phoneNum) {
        String regex = "(\\+86)|[^0-9]";
        Pattern pattern = Pattern.compile(regex );
        Matcher matcher = pattern.matcher(phoneNum);
        return matcher.replaceAll("");
    }
複製代碼

8. 點擊Edittext彈出軟鍵盤,點擊空白區域讓軟鍵盤消失

淺談BaseActivity寫法,促使咱們更高效開發

思路:在Activity的事件分發方法中去判斷,當前的焦點是否在Et上,若是是,則清除焦點和關閉軟盤。

/**
 * 清除editText的焦點
 * @param views views
 */
public void clearViewFocus(View v, View[] views) {
    if (null != views && views.length > 0) {
        for (View view : views) {
            if (v==view) {
                view.clearFocus();
                return;
            }
        }
    }
}

/**
 * 是否焦點在Et上
 *
 * @param v   焦點所在View
 * @param views 輸入框
 * @return true表明焦點在edit上
 */
public boolean isFocusEditText(View v, View[] views) {
    if (v instanceof EditText) {
        EditText et = (EditText) v;
        for (View view : views) {
            if (et.getId() == view.getId()) {
                return true;
            }
        }
    }
    return false;
}

/**
 * 判斷觸摸點,是否在過濾控件上
 * @param views views
 * @param ev ev
 * @return true / false
 */
public boolean isTouchView(View[] views, MotionEvent ev) {
    if (views == null || views.length == 0) {
        return false;
    }
    int[] location = new int[2];
    for (View view : views) {
        view.getLocationOnScreen(location);
        int x = location[0];
        int y = location[1];
        if (ev.getX() > x && ev.getX() < (x + view.getWidth())
                && ev.getY() > y && ev.getY() < (y + view.getHeight())) {
            return true;
        }
    }
    return false;
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        //1. 判斷是不是點擊了,過濾的控件
        if (isTouchView(filterViewByIds(), ev)) {
            return super.dispatchTouchEvent(ev);
        }
        //2. 若是 et 爲空,則返回
        View[] views = hideSoftByEditViewIds();
        if (views == null || views.length == 0) {
            return super.dispatchTouchEvent(ev);
        }
        //3. 判斷是不是是再次點擊了 et 控件
        if (isTouchView(views, ev)) {
            return super.dispatchTouchEvent(ev);
        }
        //4. 獲取到當前焦點的View,而後,判斷是否 view 是不是 et 中的一個,
        //      如果,就清除焦點,關掉軟盤
        View v = getCurrentFocus();
        if (isFocusEditText(v, views)) {
            clearViewFocus(v, views);
            closeKeyboard(this, v);
        }
    }
    return super.dispatchTouchEvent(ev);
}

public void closeKeyboard(Context context, View v) {
    InputMethodManager imm = (InputMethodManager) 
        context.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.hideSoftInputFromWindow(v.getWindowToken(),0);
    }
}

/**
 * 傳入EditText的Id
 * 沒有傳入的EditText不作處理
 *
 * @return id 數組
 */
public View[] hideSoftByEditViewIds() {
    return new View[] { et1, et2 };
}

/**
 * 傳入要過濾的View
 * 過濾以後點擊將不會有隱藏軟鍵盤的操做
 *
 * @return id 數組
 */
public View[] filterViewByIds() {
    return new View[] { et1, et2, btn};
}
複製代碼

注意的是,若是當前的Activity中有多個Et,那麼,清除其中一個Et後,別的Etd(佈局中的第一個)會自動獲取到焦點,其解決方法參考第4點。封裝的工具類

9. 軟鍵盤遮擋底部一點的問題

後面經過監聽軟鍵盤的高度進行解決。網上還有這個解決,爲驗證:【Android】EditText 遇到軟鍵盤遮擋底部一點的問題

相關文章
相關標籤/搜索