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

Spannable 관련 질문입니다.

0 추천
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class PageFragment extends Fragment{

    private int mPageNumber;

    SpannableStringBuilder spannableStringBuilder;

    TextView Contents;

    public static PageFragment create(int pageNumber) {
        PageFragment fragment = new PageFragment();
        Bundle args = new Bundle();
        args.putInt("page", pageNumber);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPageNumber = getArguments().getInt("page");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = null;

        switch (mPageNumber) {

            //1페이지일 경우
            case 0:

                rootView = inflater.inflate(R.layout.part1_1page_fragment, container, false);

                Contents = (TextView) rootView.findViewById(R.id.contents);

                final SpannableStringBuilder sps = new SpannableStringBuilder("");
                sps.setSpan(new ForegroundColorSpan(-6697729), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                Contents.append(sps);


                break;

            //2페이지일 경우
            case 1:
                rootView = inflater.inflate(R.layout.part1_2page_fragment, container, false);
                break;

            //3페이지일 경우
            case 2:
                rootView = inflater.inflate(R.layout.part1_3page_fragment, container, false);
                break;

            default:
                break;


        }


        return rootView;
    }
}

제가 짜고 있는 것은 ViewPager의 PagerAdapter의 getItem에서 현재 올린 코드의 create를 리턴합니다.

즉 getItem에서는 return PageFragment.create(i); 로 리턴하고 PageFragment에서는 item 값에 따라 다른 뷰를 보여주는 걸 만들고 있었습니다. 그것까지는 구현했는데 문자열에 스타일을 여러 가지를 줘야해서 Spannable을 했는데 이상하게 먹히질 않네요. 다른 예제처럼 해도 잘 안되네요. 왜 그런 걸까요?

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

1개의 답변

0 추천

spanable 사용법을 다시 한번 확인하세요.

final SpannableStringBuilder sps = new SpannableStringBuilder("");

sps.setSpan(new ForegroundColorSpan(-6697729), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Contents.append(sps);

 

.setSpan() 함수의 인자를 보시면 다음 4가지인데 Object what, int start, int end, int flags

일단 글쓴님이 문자열을 공백으로 하셨고 4번째부터 10번째까지에 적용을 한다고 지정하셨으니 안되는거지요

예를 들면 다음과 같이 하셔야해요~

 

String temp = "여기 문자열이 있어요";

final SpannableStringBuilder sps = new SpannableStringBuilder(temp); // 문자열 삽입

sps.setSpan(new ForegroundColorSpan(-6697729), 0, temp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Contents.append(sps);

 

문자열 temp 의 0번째부터 끝까지 컬러 -6697729 를 적용하여 텍스트뷰 Contents 에 append 한다. 라는 뜻이죠

초보개발자ㅠ (33,870 포인트) 님이 2014년 2월 19일 답변
질문에 올리느라 공백으로 둔 겁니다. 실제 개발할 땐 문자열이 있습니다. 그런데 적용이 안되서 그런 거죠.
Contents.append(sps);
대신
Contents.setText(sps); 해보세요~
...