開寫前的一些話語
本人從事Android開發,約莫有一年時間,關于這兩個TextView和EditText,這兩個常用控件,在大學期間,只有少量的接觸,起初覺得還挺簡單的,后來在開發中遇到相應的問題,才覺得這兩個常用的東西,還是有很多門道的,特此寫一小份帖子,供給他人取用。
1.TextView
關于這個控件,我分享一些它的相關屬性使用,方便大家在自己的項目開發中使用。
1.1增加顯示效果
1.1.1TextView.setStrikeThruText(boolean strikeThruText) 這個方法,代表是否加刪除線
1.1.2TextView.setUnderlineText(boolean underlineText) 這個方法,代表是否設置下劃線
1.1.3TextView.setFakeBoldText(boolean fakeBoldText) 這個方法,代表是否設置粗體
1.1.4.TextView.getPaint().setAntiAlias(boolean antiAlias); 這個方法,代表是否開啟抗鋸齒效果
1.2增加圖形設置
布局中,通過drawableLeft,drawableRight,drawableTop,drawableBottom屬性,在文字的上下左右,設置對應的圖片
代碼中,可以通過TextView..setCompoundDrawables(null, null, null, null)來設置
值得注意的是,方法內設置為null,即取消對應方位的圖片,一行代碼足矣
若是要在代碼中,主動設置圖片,則需要加一行:
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
如此做,應該是為了設置放置圖片的寬高,否則的話,高0,寬0的圖片設置進來,便沒有效果
完整代碼如下:
Drawable drawable=ContextCompat.getDrawable(R.drawable.icon); //比getResources方法,更加通用
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
TextView.setCompoundDrawables(null, null, drawable, null);
1.3代碼中設置TextView的長度與內容
舉例:
如以下代碼,number代表區號,mobile代表手機號,因區號和手機號的長度不定,且是從上一個頁面傳過來的,為了在這個頁面顯示,突出其顏色值,可以按照以下代碼操作,利用首尾文字是固定的特點,利用SpannableStringBuilder與ForegroundColorSpan,去設置截取中間一段,有關于帶區號手機號碼的數字:
String s = "我們已經給手機號碼" + number + " " + mobile + "發送了一個4位數的驗證碼";
TextView.setText(s);
SpannableStringBuilder builder = new SpannableStringBuilder(TextView.getText().toString());
ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(255, 102, 0));
builder.setSpan(span, 9, s.length() - 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView.setText(builder);
1.4TextView與定時器的結合
舉例:
private int nTimer = 0;
private Timer timer = null;
TimerTask timeTask = null;
private void startTimeCountdown() {
nTimer = 60;
updateCountdownButtonUI();
timer = new Timer();
timeTask = new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(1);
}
};
timer.schedule(timeTask, 1000, 1000);
}
private void stopTimeCountdown() {
if (timeTask != null) {
timeTask.cancel();
timeTask = null;
}
if (timer != null) {
timer.cancel();
timer = null;
}
nTimer = 0;
updateCountdownButtonUI();
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
nTimer--;
if (nTimer == 0) {
stopTimeCountdown();
} else
updateCountdownButtonUI();
}
super.handleMessage(msg);
}
};
private void updateCountdownButtonUI() {
if (nTimer > 0) {
TextView.setText("重新發送(" + String.format("%d", nTimer) + ")");
TextView.setTextColor(Color.rgb(189, 189, 189));
TextView.setEnabled(false);
} else {
TextView.setText("重新發送"); //.setText()是設置TextView內容的方法
TextView.setTextColor(Color.rgb(255, 102, 0)); //.setTextColor()是設置TextView顏色的方法
TextView.setEnabled(true); //setEnabled()是設置TextView是否可以響應觸摸事件
}
}
以上代碼,從進入這個頁面后,在protected void onCreate(Bundle savedInstanceState){},便調用startTimeCountdown();方法,即可將TextView置為不可點擊,且初始60秒,會在定時器的作用下,開始倒數,每隔一秒鐘,數字減1,直到mTime不在大于零,便改變TextView的文字、顏色,以及讓其可點擊。
而在再度點擊完按鈕后,除了請求接口發送短信以外,在調用startTimeCountdown();方法,便可以實現循環。
如此一來,一個限時一分鐘,才能發送一次的短信驗證碼TextView,就實現了。
注:setEnabled() 和 setClickable():
這兩個方法是有區別的
前者,setEnabled()設置為false,包括觸摸事件,都不會被響應
后者,setClickable()設置為false,還可以響應觸摸事件,且在源碼中,若是調用setOnclickListener()方法,會自動把setClickable()從false置為true
2.EditText
2.1關于EditText的一些基礎設置
2.1.1下劃線的設置
在布局中,可以設置android:background="@null",這是代表去掉下劃線的
若是你想要設置不同顏色的下劃線,改變這個參數的設置即可。
2.1.2設置光標顏色
可以在布局中,設置這個參數android:textCursorDrawable
2.1.3獲取焦點
EditText.setFocusable(true);
EditText.setFocusableInTouchMode(true);
EditText.requestFocus();
2.2inputtype屬性
指代的是,edittext控件,可輸入的類型,種類有很多,下面列舉最常用的幾種:
android:inputType="text"http://輸入類型為普通文本
android:inputType="number"http://輸入類型為數字文本
android:inputType=”phone”//輸入類型為電話號碼
android:inputType="textPassword"http://輸入一個密碼
注:代碼中也可設置
配合checkbox等控件,可以實現類似于密碼的顯示與隱藏效果,代碼如下:
public void onHideOrShow() {
if (hide_or_show.isChecked()) {
et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
et_password.setSelection(et_password.getText().length());
} else {
et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length()); //可讓在點擊切換的過程中,光標一直處于末尾處
}
}
效果如下圖:
2.3禁用復制粘貼功能
Android SDK 23 即6.0以前,想要禁用EditText的復制粘貼功能,只需:EditText.setLongClickable(false);禁用其長按點擊事件即可
Android SDK 23 即6.0以后,光是禁用EditText的長按點擊事件,還不夠:
還需:
et.setCustomInsertionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
注:因為這個方法,是6.0以后才出現的,為了避免報java.lang.NoSuchMethodError:的錯誤,考慮到兼容性,使用這個監控方法前,最好是做一個判斷,即:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
……
}
2.4輸入長度的限制
若是想要限制EditText所能夠輸入的長度,可以在代碼或布局中設置相關屬性,即:
布局中,設置android:maxLength=""
代碼中,設置editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(???)});
完了么?
并沒有。
上述方法,在大多數情況下,已經可以適用了。
可若是遇上可以輸入中文的地方,且還需要限制,比如說,設置昵稱時,以上方法,就不夠用了。
因為,在計算機底層語言中,一個漢字是等于兩個字符的,但,實際情況,在edittext的輸入過程中,漢字與字母、數字的比例,仍是一比一比一
為了匹配一些要求,比如說昵稱輸入,可以監控.addTextChangedListener方法,如下代碼所示:
舉例:
final Pattern pa = Pattern.compile("^[\\u4e00-\\u9fa5]*$"); //匹配漢字的正則表達式
et_nick.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) {
}
@Override
public void afterTextChanged(Editable s) {
String temp = et_nick.getText().toString();
char[] textChar = temp.toCharArray();
int num = 0;
for (int i = 0; i < temp.length(); i++) {
if ((pa.matcher(textChar[i] + "")).find()) {
num += 2;
} else {
num += 1;
}
if (num >= 17) {
if (num == 18 || num == 17) {
et_nick.setText(temp.substring(0, i));
Toast.makeText(mContext, "昵稱最多輸入8個漢字或16個字符", Toast.LENGTH_SHORT).show();
} else {
//Log.e("TAG",num+"----------------------");
}
break;
}
}
et_nick.setSelection(et_nick.getText().length());
}
});
2.5軟鍵盤的調取和關閉
在一些頁面,需要在一進來時,便獲取EditText的焦點,并彈出軟鍵盤,要實現這個效果,需要在AndroidManifest.xml做相關的配置,即:
<activity
android:name=""
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateVisible|adjustPan" />
關鍵代碼,應該是最后一行代碼。
至于,在代碼中跳轉到下一個頁面,手動關閉軟鍵盤的代碼,如下:
//如果顯示輸入框就關閉
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}
2.6關于EditText最后的一些補充
2.6.1
EditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
return true;
}
return false;
}
});
此方法,可監控軟鍵盤是否按下、刪除,可在其中做一些操作,返回true表示相應,返回false表示不響應
2.6.2
有些時候,對于edittext的輸入,會做一定的要求,比如說必須數字,必須字母,必須大寫之內的,下面提供一個,必須包含兩種不同字符,即數字、字母,特殊字符,至少有其二的一個方法:
public static boolean isContain(String str) {
boolean isDigit = false;//定義一個boolean值,用來表示是否包含數字
boolean isLetter = false;//定義一個boolean值,用來表示是否包含字母
boolean isOther = false;//定義一個boolean值,用來表示是否包含字符
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i))) { //用char包裝類中的判斷數字的方法判斷每一個字符
isDigit = true;
} else if (Character.isLetter(str.charAt(i))) { //用char包裝類中的判斷字母的方法判斷每一個字符
isLetter = true;
} else {
isOther = true;
}
}
boolean isRight = (isDigit && isLetter) || (isDigit && isOther) || (isLetter && isOther);
return isRight;
}
總結
在參加工作的這一年里,我感覺自己學到了很多,從一開始的懵懵懂懂,到現在,是越來越自信了。
而關于我以上所述的,其實通過百度、google,都是可以找到的,在技術這一路上,不管是Android,還是其他語言,需要的是獨立自主解決問題的能力,學會學習,你才能在這條路上走得更遠,最后,祝你我都能成為更好的Android開發人員。