使用: 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>
複製代碼
使用: android:background="@drawable/edit_msg_dialog_bg"
去替換: 這裏給出一個例子:html
<?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
<?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>
複製代碼
<?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>
複製代碼
使用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);
}
}
});
複製代碼
Android中Activity中某個EditText被clearFocus後其餘控件(別的EditText)也不要得到焦點github
一樣的問題:Android中Activity中某個EditText被clearFocus後其餘控件(別的EditText),會自動獲取到焦點,此時也能夠用如下的方法解決。在佈局的最外層,頂級父佈局中,設置:數組
android:focusable="true"
android:focusableInTouchMode="true"
複製代碼
這樣,就把EditText默認的行爲截斷了!在未點擊Edittext前,EditText不會顯示光標bash
EditText et = (EditText)findViewById(R.id.inbox);
et.setSelection(et.getText().length());
複製代碼
如何限制只能輸入指定的字符
設置 android:digits 屬性便可
android:digits = "abcdef"
限制只能輸入:abcdef
android:digits="1234567890"
限制只能輸入數字
複製代碼
這裏以手機號爲例,每使用空格分隔成,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("");
}
複製代碼
思路:在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點。封裝的工具類
後面經過監聽軟鍵盤的高度進行解決。網上還有這個解決,爲驗證:【Android】EditText 遇到軟鍵盤遮擋底部一點的問題