EditText(第2章)-对hint进行整容

简书地址:http://www.jianshu.com/p/023b2e482d64

EditText(第2章)-对hint进行整容_第1张图片

上图是个简单的EditText,默认的hint颜色和大小都是系统默认的,下面我准备对EditText的hint进行一个整容小手术。


1.如何改变hint的颜色


手术开始了,第一刀准备整下他的颜色:

技术支持:

android:textColorHint="#FF0000"//改变Hint的文字颜色
android:textColor="#0000FF"//改变输入的文字颜色

术后效果:

EditText(第2章)-对hint进行整容_第2张图片

手术结果:

成功!很好的改变的文字的颜色,而且没有排除反应(text和hint的冲突)


2.如何改变hint的文字大小


基于上次手术的成功,信心大增,开始下一刀改变文字的大小:

技术支持:

android:textSize="24sp"//设置文字大小

术后效果:

EditText(第2章)-对hint进行整容_第3张图片

手术结果:

失败!将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) {   
           //在文字改变的之后
          }
}); 

术后效果:

EditText(第2章)-对hint进行整容_第4张图片

手术结果:
成功!简单粗暴解决了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);

你可能感兴趣的:(安卓基础控件)