A Day In The Life

とあるプログラマの備忘録

TextViewの特定の文字列を画像に置きかえる方法

TextViewの特定の文字列を画像に置きかえたいことって意外とあると思います。
たとえば":)"という文字列をスマイリー画像に置きかえたいとか、そんな時にはcom.google.android.utilパッケージにあるSmileyResourcesクラスとSmileyParserクラスを使うと比較的簡単にできます。


SmileyResourceとSmileyParserの使い方

  1. 変換したい文字列の配列と対応する画像のリソースIDの配列を用意します。
  2. 2つの配列を使ってSmileyResourcesオブジェクトを生成します(SmileyResourcesオブジェクトはこの2つの配列をMapを使って内部で管理してくれます)。
  3. 解析したい文字列とSmileyResourceオブジェクトを使ってSmileyParserオブジェクトを生成します。
  4. SmileyParserオブジェクトのparseメソッドを呼んで文字列を解析して画像に変換します。
コードにするとこんな感じです。

import com.google.android.util.SmileyParser;
import com.google.android.util.SmileyResources;

public class Smiley {
  public static final String[] SMILIES = { ":)", ":D", ";)", ":(" };
  public static final int[] SMILEY_RES_IDS = { R.drawable.happy,
                                               R.drawable.laughter,
                                               R.drawable.winky,
                                               R.drawable.frowning };
  public static CharSequence getParsedText(Context context, String text) {
    SmileyParser sp = new SmileyParser(text, new SmileyResources(SMILIES, SMILEY_RES_IDS));
    sp.parse();
    CharSequence cs = sp.getSpannableString(context);
    return cs;
  }
}

上記で作成したメソッドを以下のように使用するとTextViewの特定文字列が画像に置きかわります。

public class SampleActivity extends Activity {
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    TextView text = (TextView) findViewById(R.id.hoge_text);
    CharSequence cs = Smiley.getParsedText(this, text.getText().toString());
    text.setText(cs);
  }
  :
}

早速この機能Mame Talkのチャットに実装してみました。
黄色のSmileyマークの表示が今回実装したところです。
Smileyに対応したMame Talk

ちなみにSmiley画像はDesigntiveさんで公開されているフリーの画像を使いました。