1. 程式人生 > >EditText(第2章)-對hint進行整容

EditText(第2章)-對hint進行整容

上圖是個簡單的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) { //在文字改變的之後 } });

術後效果:

EditText04.gif

手術結果:
成功!簡單粗暴解決了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);