Android開発ノート(六)可変文字列


Andoridのテキストは、androidのTextViewコントロールに表示されています.Text Viewから継承された他のコントロール、例えばButton、CheckBox、EditText、RadioButtonなど、setTextを使ってテキストの色を設定し、setTextColor設定テキストの色を揃えます.setTextApppearanceを使用してテキストの各属性(色、サイズ、スタイルを含む)を設定することもできます.しかし、コントロール上のすべてのテキストに対して統一的に設定するしかないです.前のテキストを太くしたいなら、中間のテキストに赤色を表示し、後のテキストにハイパーリンクを追加したいなら、別の方法を考えなければなりません.幸いなことに、androidは可変文字列Spannable Stringを提供してくれて、テキストの区切り表示ができます.
Spannable StringアプリケーションSpannableStringは、文字列の一部にそれぞれ異なるスタイルを設定することができます.様々なスタイルのソースコードは、androidのソースバッグの中のandroid.text.styleに30個もあります.全部は把握できないようです.いくつかのよく使われているものを選んで練習します.上に述べた三段のテキストをそれぞれ表示してそれぞれ処理します.
最初に可変文字列を作成します.
String itemText = "Hello world. "
SpannableString spanText = new SpannableString("Hello world. ");
最初の段落のテキストのサイズ変更にはRelativeSizaSpanを採用し、太字にはSteyle Spanを採用しています.コードは以下の通りです.
		spanText.setSpan(new RelativeSizeSpan(1.5f) , 0, first_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		spanText.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, first_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
上のsetSpanの最初のパラメータは設定されたスタイルオブジェクトを表し、2番目のパラメータはこのセグメントテキストの開始位置を表し、3番目のパラメータはこの段落テキストの終了位置を表し、4番目のパラメータはSpan範囲のテキストの前後に新しい文字を入力するときにもこの効果を適用するかどうかを識別するために使用されます.SPAN_がありますEXCLUSIVE_EXCLUSIVE(前後は含まない)、SPAN_INCLUSIVE_EXCLUSIVE(前に含む、後ろには含まれない)、SPAN_EXCLUSIVE_INCLUSIVE(前には含まれていません.後ろには含まれていません)、SPAN_INCLUSIVE_INCLUSIVE(前後とも含む).
二段目のテキストは文字サイズを変えてもRelativeSizaSpanを採用しています.色を変えるにはForeground ColorSpanを採用しています.コードは以下の通りです.
		spanText.setSpan(new RelativeSizeSpan(0.75f), first_length+1, second_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		spanText.setSpan(new ForegroundColorSpan(Color.RED), first_length+1, second_length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
第三段コードのハイパーリンクはやや複雑です.ハイパーチェーンの下線を表示し、クリック時に指定されたurlアドレスにジャンプします.ここでURLSpanを引き継いで書き換えます.
	private static class MyURLSpan extends URLSpan {
		public MyURLSpan(String url) {
			super(url);
		}


		@Override
		public void onClick(View widget) {
			System.out.println("MyURLSpan onClick");
			String url = "http://blog.csdn.net/aqi00";
			wv_go.loadUrl(url);
			wv_go.requestFocus();
			wv_go.setWebViewClient(new WebViewClient());
			return;
		}
	}


		String str_url = "Let's go.";
		Spannable sp = (Spannable) Html.fromHtml("<a href=\"\">"+str_url+"</a>");
		CharSequence text = sp.toString();
		URLSpan[] urls = sp.getSpans(0, text.length(), URLSpan.class);
		for (URLSpan url : urls) {
			MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
			spanText.setSpan(myURLSpan, second_length+1, itemText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		}
最後にこの可変文字列をコントロールに入力します.
tv_hello.setText(spanText);
効果のスクリーンショットを表示します.
ここをクリックして本文の可変文字列の例コードをダウンロードします.