마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

TextView 관련 질문입니다.

0 추천

줄바꿈을 위해서 Custom TextView를 사용하고 있는데요. 이 CTextView에 Spannable효과를 주고 싶은데 해당 코드를 작성해도 효과가 나지 않네요. Html.fromHtml로도 나지 않습니다.

왜 이럴까요?



import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.BackgroundColorSpan;
import android.util.AttributeSet;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * 클래스설명 : 텍스트의 줄바꿈을 공백기준이 아닌 한글자 단위로 한다.
 * @version : 2011. 8. 06.
 * @author : CEnA - mibany
 * @분류 :
 */
public class CTextView extends TextView {

    private int mAvailableWidth = 0;
    private Paint mPaint;
    private List<String> mCutStr = new ArrayList<String>();
    public SpannableString spannable;

    public CTextView(Context context) {
        super(context);
    }

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

    private int setTextInfo(String text, int textWidth, int textHeight) {
        // 그릴 페인트 세팅
        mPaint = getPaint();
        mPaint.setColor(getTextColors().getDefaultColor());
        mPaint.setTextSize(getTextSize());

        int mTextHeight = textHeight;

        if (textWidth > 0) {
            // 값 세팅
            mAvailableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();

            mCutStr.clear();
            int end = 0;
            String[] textArr = text.split("\n");
            for(int i=0; i<textArr.length; i++) {
                if(textArr[i].length() == 0) textArr[i] = " ";
                do {
                    // 글자가 width 보다 넘어가는지 체크
                    end = mPaint.breakText(textArr[i], true, mAvailableWidth, null);
                    if (end > 0) {
                        // 자른 문자열을 문자열 배열에 담아 놓는다.
                        mCutStr.add(textArr[i].substring(0, end));
                        // 넘어간 글자 모두 잘라 다음에 사용하도록 세팅
                        textArr[i] = textArr[i].substring(end);
                        // 다음라인 높이 지정
                        if (textHeight == 0) mTextHeight += getLineHeight();
                    }
                } while (end > 0);
            }
        }
        return mTextHeight;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 글자 높이 지정
        float height = getPaddingTop() + getLineHeight();
        for (String text : mCutStr) {
            // 캔버스에 라인 높이 만큰 글자 그리기
            canvas.drawText(text, getPaddingLeft(), height, mPaint);
            height += getLineHeight();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
        int height = setTextInfo(this.getText().toString(), parentWidth, parentHeight);
        // 부모 높이가 0인경우 실제 그려줄 높이만큼 사이즈를 놀려줌...
        if (parentHeight == 0)
            parentHeight = height;
        this.setMeasuredDimension(parentWidth, parentHeight);
    }

    @Override
    protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) {
        // 글자가 변경되었을때 다시 세팅
        setTextInfo(text.toString(), this.getWidth(), this.getHeight());
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        // 사이즈가 변경되었을때 다시 세팅(가로 사이즈만...)
        if (w != oldw) {
            setTextInfo(this.getText().toString(), w, h);
        }
    }
}

해당 코드는 다른 블로그에서 참고하였습니다.

익명사용자 님이 2014년 2월 21일 질문

1개의 답변

0 추천

그대로 긁어 오신거에요?

spannable 쓰신다면서 위 코드에는

public SpannableString spannable; 선언만 되있지 사용부분은 없는데요?

 

"Spannable효과를 주고 싶은데 해당 코드를 작성해도 효과가 나지 않네요."

어떤 효과를 바라시는 건지..?

 

p.s 혹시 밑에 청정또라에몽님이랑 동일인물 아니세요? ㅎㅎㅎㅎ

초보개발자ㅠ (33,870 포인트) 님이 2014년 2월 21일 답변
거참 기분 나쁘게 답변 다시네요. setSpan한 SpannableString을 setText했을 때 효과가 나타나지 않았습니다. 그리고 Spannable 효과라고 하면 대충 스타일 효과주는 건 알고 계실텐데요? 그리고 분명 블로그에서 가져왔다고 글에도 써놨습니다 참나.
아.. 밑에 글 중에 너무 무성의하게 질문하신분의 글을 보고 온터라.. 기분나쁘셨다면 죄송합니다. 그분 댓글에도 코멘트했지만 ;; 글쓴님의 글을 보면 과정이 생략되있네요.. 제가 이 글에 대한 답변으로 "해봤는데 되네요" 적은거랑 같은 맥락이지요 솔직히 질문하실때 본인이 이렇게 이렇게 해봤는데 안되더라 내 소소는 이렇다 정도는 해줘야하지않을까요. . 해당코드를 작성했는데 안된다 하시면 코드를 잘못작성하신걸수도 있고 선언위치가 잘못된걸수도 있고 경우의 수는 다양합니다.

1. 구체적인 상황 시나리오
2. 문제
3. 문제해결을 위해 본인이 취한 방법, 현재상황

을 알려주세요~
...