編輯:關於Android編程
TextWatcher接口為EditText控件的響應字符輸入事件提供了3個方法,這三個方法分別為:
public void beforeTextChanged(CharSequence s, int start, int count, int after) public void onTextChanged(CharSequence s, int start, int before, int count) public void afterTextChanged(Editable s)我們通過自定義一個類,實現該接口,然後重寫這三個方法,將輸入的字符保存到StringBuilder中,而在EditText實際顯示的是*
號。這樣當你hook住EditText.getText()的時候,獲取的密碼肯定是多個*
,而實際的密碼保存在StringBuilder
中。
public class EditChangedListener implements TextWatcher {
private static final String TAG = "EditChangedListener";
private CharSequence temp;
private EditText editText;
private boolean add = false;
private StringBuilder password = new StringBuilder();
private int mStart;
public EditChangedListener(EditText editText) {
this.editText = editText;
}
//after表示這次新加了幾個字符,count表示舊的內容中被修改了幾個字符,start表示修改的開始位置
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// Log.i(TAG, "beforeTextChanged : " + s + ",start = " + start + ",count = " + count + ",after = " + after);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//before 原有內容被修改的數量,count為新增的數量,start為操作位置
if (s.length() == 0) return;
// Log.i(TAG, "onTextChanged : " + s + ",start = " + start + ",count = " + count + ",before = " + before);
if (count == 0 && password.length() > start) {
password.deleteCharAt(start);
Log.i(TAG, "刪除了第" + start + "個字符 : " + s.charAt(start - 1));
inputStarForEdit(password.length());
add = false;
return;
}
if (count > 0) {
add = true;
}
}
@Override
public void afterTextChanged(Editable s) {
if (!add || s.length() == 0) return;
int length = s.length();
char c = s.charAt(length - 1);
if (c == '*') return;
password.append(c);
inputStarForEdit(length);
}
private void inputStarForEdit(int length) {
editText.getText().clear();
for (int i = 0; i < length; ++i) {
editText.getText().append("*");
}
Log.i(TAG, "真實的為密碼: " + password.toString() + ",偽裝的密碼為 : " + editText.getText());
}
}
這裡面的代碼邏輯,一定要理解,核心在這
mPasswordView = (EditText) findViewById(R.id.password);
mPasswordView.addTextChangedListener(new EditChangedListener(mPasswordView));
具體應用到你項目中,可能要考慮的問題比上面的demo要多,但是原理基本差不多,招行銀行的策略與上面類似。
先給大家炫下效果圖:首先過程中碰到的幾個問題:1、對 EditText 進行自定義背景2、運行時自動 EditText 自動獲得焦點3、在獲得焦點時即清空 hint ,而
動態圖現今已經成為各位機友們發朋友圈和說說必不可少的神器,但是作為手機黨要做動態圖就得費上不少時間和功夫了。那麼魅族pro6怎麼制作GIF動態圖呢?下面咱們
在簡易音樂播放器中,用了Handler,也沒有過多地去研究學習,這裡再學習下android下的異步消息處理機制。這裡用了Handler主要是在線程中不能更新UI,而需要通
EditText和TextView一樣,也可以進行圖文混排。所不同的是,TextView只用於顯示圖文混排效果,而EditText不僅可顯示,也可混合輸入文字和圖像,讓我