【筆記】android裡的EditText焦點的應用

看海的魚發表於2016-12-10

對於在介面裡有EditText控制元件的,當使用輸入鍵盤上的右下角那個功能鍵,會發現自動把焦點移到EditText中開始編輯。

對於想在EditText編輯完後進行某種處理,而後面又沒有控制元件來獲取焦點時,使用setOnFocusChangeListener容易出現焦點自動改變不了的情況。如下面例子,希望在輸入正確年份後,在一個TextView上顯示相應地年齡。不過發現在輸入正確年份後,輸入法鍵盤不會消失,焦點還是在這個EditText上,這就導致運算沒法進行,只能通過按返回鍵才能結束這個焦點狀態。

edittxt.setOnFocusChangeListener(new View.OnFocusChangeListener() {
			@Override
			public void onFocusChange(View view, boolean isfocused) {
				String getyear = yearEdt.getText().toString();
				if(!(null==getyear || getyear.length()==0) && getyear.length()==4){
					if(getyear.matches("([1-2])(\\d{3})")){
						int currentyear=Calendar.getInstance().get(Calendar.YEAR);
						int age = currentyear - Integer.parseInt(getyear);
						if(age>0){
							agetxt.setText(String.valueOf(age)+"歲");
							return;
						}
				}
					Toast.makeText(MainActivity.this, "請輸入正確的出生年份", Toast.LENGTH_LONG).show();
				}
			}
		});
這裡,可以用addTextChangedListener(new TextWatcher() {});來動態地監聽輸入地內容,當滿足正確地輸入內容後,自動開始進行相關操作。還是上面舉那個例子。

edittxt.addTextChangedListener(new TextWatcher() {

@Override public void onTextChanged(CharSequence s, int start, int before, int count) { String getyear = yearEdt.getText().toString(); if(!(null==getyear || getyear.length()==0) && getyear.length()==4){ yearEdt.clearFocus(); if(getyear.matches("([1-2])(\\d{3})")){ int currentyear=Calendar.getInstance().get(Calendar.YEAR); int age = currentyear - Integer.parseInt(getyear); if(age>0){ agetxt.setText(String.valueOf(age)+"歲"); sexGroup.requestFocus(); sexGroup.requestFocusFromTouch(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(yearEdt.getWindowToken(), 0); return; } } Toast.makeText(MainActivity.this, "請輸入正確的出生年份", Toast.LENGTH_LONG).show(); yearEdt.requestFocus(); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } });由於是在每個輸入字元改變時就會觸發監聽,所以在輸入長度滿足條件後便開始進行資料處理,使用clearFocus()失去焦點,不再進行編輯。內容正確則計算結果輸出顯示。然後將焦點移到下一個控制元件上,這就使用requestFocus(),requestFocusFromTouch()來主動獲取焦點。

不過此時輸入法的鍵盤不會隱藏,非常礙眼。通過呼叫系統的輸入法服務

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yearEdt.getWindowToken(), 0);
來將鍵盤關閉。


相關文章