开发者

Android how to make TextView text bold when pressed or focussed

I have a text view in my layout. My requirement is when I press or focus it, the text should be bold. Otherwise it should be with开发者_运维问答 the normal font. How can I implement it?


Use below code

TextView name=((TextView)findViewById(R.id.TextView01));


name.hasFocus();
        name.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            public void onFocusChange(View v, boolean hasFocus) {
                // TODO Auto-generated method stub
                if(hasFocus)
                    ((TextView)findViewById(R.id.TextView01)).setTypeface(Typeface.DEFAULT_BOLD);
                else
                    ((TextView)findViewById(R.id.TextView01)).setTypeface(Typeface.DEFAULT);

            }
        });

        name.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                ((TextView)findViewById(R.id.TextView01)).setTypeface(Typeface.DEFAULT_BOLD);
                return false;

} });


I actually created a small class to make this a lot easier: ClickTextView. You can copy-paste it into your project and Android Studio should fix it.

public class ClickTextView extends android.support.v7.widget.AppCompatTextView {

    Rect rect;

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

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

    public ClickTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init(){
        setClickable(true);
        rect = new Rect();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        if (action == MotionEvent.ACTION_DOWN
                || action == MotionEvent.ACTION_HOVER_ENTER){
            this.setTypeface(Typeface.DEFAULT_BOLD);
            getHitRect(rect);
        }else if (action == MotionEvent.ACTION_MOVE){
            boolean inView = rect.contains(getLeft() + (int) event.getX(), getTop() + (int) event.getY());
            this.setTypeface(inView ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
        }else if (action == MotionEvent.ACTION_UP
                || action == MotionEvent.ACTION_CANCEL
                || action == MotionEvent.ACTION_HOVER_EXIT
                || action == MotionEvent.ACTION_OUTSIDE) {
            this.setTypeface(Typeface.DEFAULT);
        }

        return super.onTouchEvent(event);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);

        if (focused) this.setTypeface(Typeface.DEFAULT_BOLD);
        else this.setTypeface(Typeface.DEFAULT);
    }
}

It also provides a solution for the case that a user clicks your view, but drags his finger outside of the view bounds. If released there, Android will not register a click, so the text shouldn't be bold either.

Feel free to use it wherever you like.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜