EditText(第2章)-對hint進行整容
阿新 • • 發佈:2019-01-07
序
上圖是個簡單的EditText,預設的hint顏色和大小都是系統預設的,下面我準備對EditText的hint進行一個整容小手術。
1.如何改變hint的顏色
手術開始了,第一刀準備整下他的顏色:
技術支援:
android:textColorHint="#FF0000"//改變Hint的文字顏色
android:textColor="#0000FF"//改變輸入的文字顏色
術後效果:
手術結果:
成功!很好的改變的文字的顏色,而且沒有排除反應(text和hint的衝突)
2.如何改變hint的文字大小
基於上次手術的成功,信心大增,開始下一刀改變文字的大小:
技術支援:
android:textSize="24sp"//設定文字大小
術後效果:
手術結果:
失敗!將text的文字大小也同時改變了(就像一個妹子想來隆個鼻子,然後你順帶把她臉給隆了,結果自行腦補)
3.解決hint和text的文字大小衝突
上面的手術失敗了,於是我去韓國進修了一段時間,帶來了最新技術:
技術支援:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//在文字改變之前
editText.setTextSize(16);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//在文字改變的時候
if (TextUtils.isEmpty(s)) {
editText.setTextSize(16 );//這裡的單位是sp
}else{
editText.setTextSize(30);
}
}
@Override
public void afterTextChanged(Editable s) {
//在文字改變的之後
}
});
術後效果:
手術結果:
成功!簡單粗暴解決了text和hint的衝突
原理分析:
利用對輸入文字的監聽TextWatcher,根據是否輸入文字來判斷目前顯示的是hint還是text,從而動態設定文字的小大。
注意:在文字改變前也需要設定TextSize並且需要和onTextChanged中“沒有文字時候”的大小統一
4.解決hint和text的文字大小衝突方法2
上面已經可以成功解決了問題,可是好不容易去一次“韓國”,我還偷學了另一種技術:
技術支援:
// 新建一個可以新增文字的物件
SpannableString ss = new SpannableString("隨便輸");
// 設定文字字型大小
AbsoluteSizeSpan ass = new AbsoluteSizeSpan(8, true);
// 將字型大小附加到文字的屬性
ss.setSpan(ass, 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 設定hint屬性
editText.setHint(new SpannedString(ss));
手術結果:
當然是成功的!這裡就不貼圖了
特別說明:需要注意的是上面程式碼中8的單位dp,如果設定為false,那麼單位就是px。
這裡提供一個工具類(摘自Android群英傳,徐醫生的書,強力推薦!)幫你轉換成sp:
public class DisplayUtil {
/**
* px轉換為dp,保證文字大小不變
*
* @param context
* @param pxValue
* @return
*/
public static int pxTodp(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* dp轉換為px,保證文字大小不變
*
* @param context
* @param dpValue
* @return
*/
public static int dpTopx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* px轉換為sp,保證文字大小不變
*
* @param context
* @param pxValue
* @return
*/
public static int pxTosp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* sp轉換為px,保證文字大小不變
*
* @param context
* @param spValue
* @return
*/
public static int spTopx(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
/**
* dp轉換px,保證文字大小不變,系統的util
*
* @param context
* @param dp
* @return
*/
public static int dpTopx(Context context, int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
context.getResources().getDisplayMetrics());
}
/**
* sp轉換px,保證文字大小不變,系統的util
*
* @param context
* @param dp
* @return
*/
public static int spTopx(Context context, int sp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
context.getResources().getDisplayMetrics());
}
}
使用方法:
AbsoluteSizeSpan ass = new AbsoluteSizeSpan(DisplayUtil.spTopx(getApplicationContext(),16), false);