2015-01-14 4 views
0

이 구체적인 예 저는 힌트 텍스트 색상을 프로 그로 모멀하게 설정해야하지만 변경할 수는 없습니다. 내 활동에서 호출 할 때 난 단지 XML에서 설정하면프로그래밍 방식으로 hintcolor를 설정하는 방법

public class FloatingHintEditText extends EditText { 
    private static enum Animation { NONE, SHRINK, GROW } 

    private final Paint mFloatingHintPaint = new Paint(); 
    private final ColorStateList mHintColors; 
    private final float mHintScale; 
    private final int mAnimationSteps; 

    private boolean mWasEmpty; 
    private int mAnimationFrame; 
    private Animation mAnimation = Animation.NONE; 

    public FloatingHintEditText(Context context) { 
     this(context, null); 
    } 

    public FloatingHintEditText(Context context, AttributeSet attrs) { 
     this(context, attrs, R.attr.floatingHintEditTextStyle); 
    } 

    public FloatingHintEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     TypedValue typedValue = new TypedValue(); 
     getResources().getValue(R.dimen.floatinghintedittext_hint_scale, typedValue, true); 
     mHintScale = typedValue.getFloat(); 
     mAnimationSteps = getResources().getInteger(R.dimen.floatinghintedittext_animation_steps); 

     mHintColors = getHintTextColors(); 
     mWasEmpty = TextUtils.isEmpty(getText()); 
    } 

    @Override 
    public int getCompoundPaddingTop() { 
     final FontMetricsInt metrics = getPaint().getFontMetricsInt(); 
     final int floatingHintHeight = (int) ((metrics.bottom - metrics.top) * mHintScale); 
     return super.getCompoundPaddingTop() + floatingHintHeight; 
    } 

    @Override 
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { 
     super.onTextChanged(text, start, lengthBefore, lengthAfter); 

     final boolean isEmpty = TextUtils.isEmpty(getText()); 

     // The empty state hasn't changed, so the hint stays the same. 
     if (mWasEmpty == isEmpty) { 
      return; 
     } 

     mWasEmpty = isEmpty; 

     // Don't animate if we aren't visible. 
     if (!isShown()) { 
      return; 
     } 

     if (isEmpty) { 
      mAnimation = Animation.GROW; 
      setHintTextColor(Color.TRANSPARENT); 
     } else { 
      mAnimation = Animation.SHRINK; 
     } 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     if (TextUtils.isEmpty(getHint())) { 
      return; 
     } 

     final boolean isAnimating = mAnimation != Animation.NONE; 

     // The large hint is drawn by Android, so do nothing. 
     if (!isAnimating && TextUtils.isEmpty(getText())) { 
      return; 
     } 

     mFloatingHintPaint.set(getPaint()); 
     mFloatingHintPaint.setColor(
       mHintColors.getColorForState(getDrawableState(), mHintColors.getDefaultColor())); 

     final float hintPosX = getCompoundPaddingLeft() + getScrollX(); 
     final float normalHintPosY = getBaseline(); 
     final float floatingHintPosY = normalHintPosY + getPaint().getFontMetricsInt().top + getScrollY(); 
     final float normalHintSize = getTextSize(); 
     final float floatingHintSize = normalHintSize * mHintScale; 

     // If we're not animating, we're showing the floating hint, so draw it and bail. 
     if (!isAnimating) { 
      mFloatingHintPaint.setTextSize(floatingHintSize); 
      canvas.drawText(getHint().toString(), hintPosX, floatingHintPosY, mFloatingHintPaint); 
      return; 
     } 

     if (mAnimation == Animation.SHRINK) { 
      drawAnimationFrame(canvas, normalHintSize, floatingHintSize, 
        hintPosX, normalHintPosY, floatingHintPosY); 
     } else { 
      drawAnimationFrame(canvas, floatingHintSize, normalHintSize, 
        hintPosX, floatingHintPosY, normalHintPosY); 
     } 

     mAnimationFrame++; 

     if (mAnimationFrame == mAnimationSteps) { 
      if (mAnimation == Animation.GROW) { 
       setHintTextColor(mHintColors); 
      } 
      mAnimation = Animation.NONE; 
      mAnimationFrame = 0; 
     } 

     invalidate(); 
    } 

    private void drawAnimationFrame(Canvas canvas, float fromSize, float toSize, 
            float hintPosX, float fromY, float toY) { 
     final float textSize = lerp(fromSize, toSize); 
     final float hintPosY = lerp(fromY, toY); 
     mFloatingHintPaint.setTextSize(textSize); 
     canvas.drawText(getHint().toString(), hintPosX, hintPosY, mFloatingHintPaint); 
    } 

    private float lerp(float from, float to) { 
     final float alpha = (float) mAnimationFrame/(mAnimationSteps - 1); 
     return from * (1 - alpha) + to * alpha; 
    } 
} 

그래서 mEditText.setHintTextColor(getResources().getColor(R.color.red)) 색상이 색상 변경은 변경되지 않습니다.

mEditText.invalidate()를 시도했지만 도움이되지 않습니다. hintTextColor를 빨간색으로 만들려면 어떻게해야합니까?

+0

당신이 당신의 활동을 게시 할 수 있습니까? – safaiyeh

+0

내 활동에는 특별한 것이 없습니다. 그냥 mEditText.setHintTextColor (getResources(). getColor (R.color.red))를 호출 할 때 – pmb

답변

0

은 필드가없는 최종 확인이 시도 :

public FloatingHintEditText(Context context) { 
    super(context); 
    init(); 
} 

public FloatingHintEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public FloatingHintEditText(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(); 
} 

private void init() { 
    TypedValue typedValue = new TypedValue(); 
    getResources().getValue(R.dimen.floatinghintedittext_hint_scale, typedValue, true); 
    mHintScale = typedValue.getFloat(); 
    mAnimationSteps = getResources().getInteger(R.dimen.floatinghintedittext_animation_steps); 

    mHintColors = getHintTextColors(); 
    mWasEmpty = TextUtils.isEmpty(getText()); 
} 
+0

mEditText.setHintTextColor (getResources(). getColor (R.color.red))를 호출하면 색상이 변경되지 않습니다. 뭔가 놓친거야? – pmb

+0

@pmb'setHintTextColor (Color.RED);로 바꾼다면 테스트를했고 색상이 제대로 설정되었습니다. 즉, 'ColorStateList'에 논리에 문제가 있다는 뜻입니다. – Simas

관련 문제