にすることは可能で複数のスタイル内のTextView?
質問
が設定できるようにする複数のスタイルは個々のテキスト内のTextView?
例えば、設定のテキストとして
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
にすることは可能でデータアーカイブシステムのための各テキスト要素かどうかが判別されます。E.g.) line1ボword1italicなど。
開発者ガイド 共通の課題とどのようなスケーラビリティ 含まれ 選定のハイライト表示、またはスタイリング部分のテキスト:
// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // Get the EditText's internal text storage Spannable str = vw.getText(); // Create our span sections, and assign a format to each. str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ものを使用する明示的な位置番号のです。りクリーナーいか。
解決
場合は、誰がどんな風にこのためには、こちらの方法:(マーク!)
mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" + "<br />" +
"<small>" + description + "</small>" + "<br />" +
"<small>" + DateAdded + "</small>"));
のために、各社の商標または登録商標一覧のタグを支えに、この方法を参照して このリンク またはこの質問: るHTMLタグを支えるのはAndroid TextView?
他のヒント
Html.fromHtml()
を試してみて、そしてボールドとイタリックHTMLタグ例えばを使用してテキストをマークアップ:
Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff");
textView.setText(text);
少し話が逸れましたが、これはとても便利なのでここでは触れません。
HTML テキストを読みたい場合はどうすればよいですか? 文字列.xml リソースに含まれるため、ローカライズが容易になります。 CDATA これを可能にします:
<string name="my_text">
<![CDATA[
<b>Autor:</b> Mr Nice Guy<br/>
<b>Contact:</b> myemail@grail.com<br/>
<i>Copyright © 2011-2012 Intergalactic Spacebar Confederation </i>
]]>
</string>
Java コードから次のように利用できるようになりました。
TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text)));
これがうまくいくとは予想していませんでした。しかし、そうなりました。
一部の人にとって役立つことを願っています。
、あなただけのstyles.xmlを作成し、このようにそれを使用することができます:
TextView tv = (TextView) findViewById(R.id.textview);
SpannableString text = new SpannableString(myString);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(text, TextView.BufferType.SPANNABLE);
を使用するとより軽量です SpannableString
HTMLマークアップの代わりに。視覚的な例を見るのに役立つので、ここで補足的な回答を示します。
これはシングルです TextView
.
// set the text
SpannableString s1 = new SpannableString("bold\n");
SpannableString s2 = new SpannableString("italic\n");
SpannableString s3 = new SpannableString("foreground color\n");
SpannableString s4 = new SpannableString("background color\n");
SpannableString s5 = new SpannableString("underline\n");
SpannableString s6 = new SpannableString("strikethrough\n");
SpannableString s7 = new SpannableString("bigger\n");
SpannableString s8 = new SpannableString("smaller\n");
SpannableString s9 = new SpannableString("font\n");
SpannableString s10 = new SpannableString("URL span\n");
SpannableString s11 = new SpannableString("clickable span\n");
SpannableString s12 = new SpannableString("overlapping spans\n");
// set the style
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), flag);
s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), flag);
s3.setSpan(new ForegroundColorSpan(Color.RED), 0, s3.length(), flag);
s4.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, s4.length(), flag);
s5.setSpan(new UnderlineSpan(), 0, s5.length(), flag);
s6.setSpan(new StrikethroughSpan(), 0, s6.length(), flag);
s7.setSpan(new RelativeSizeSpan(2), 0, s7.length(), flag);
s8.setSpan(new RelativeSizeSpan(0.5f), 0, s8.length(), flag);
s9.setSpan(new TypefaceSpan("monospace"), 0, s9.length(), flag);
s10.setSpan(new URLSpan("https://developer.android.com"), 0, s10.length(), flag);
s11.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(getApplicationContext(), "Span clicked", Toast.LENGTH_SHORT).show();
}
}, 0, s11.length(), flag);
s12.setSpan(new ForegroundColorSpan(Color.RED), 0, 11, flag);
s12.setSpan(new BackgroundColorSpan(Color.YELLOW), 4, s12.length(), flag);
s12.setSpan(new UnderlineSpan(), 4, 11, flag);
// build the string
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(s1);
builder.append(s2);
builder.append(s3);
builder.append(s4);
builder.append(s5);
builder.append(s6);
builder.append(s7);
builder.append(s8);
builder.append(s9);
builder.append(s10);
builder.append(s11);
builder.append(s12);
// set the text view with the styled text
textView.setText(builder);
// enables clicking on spans for clickable span and url span
textView.setMovementMethod(LinkMovementMethod.getInstance());
さらなる研究
- SPAN_EXCLUSIVE_EXCLUSIVE などのスパン フラグの意味を説明する
- Android の Spanned、SpannedString、Spannable、SpannableString、CharSequence
- スパンの種類
この例は元々、以下からインスピレーションを得たものです。 ここ.
サポートされているタグのリストがあります:
あなたは文字列リソースを使用する場合は、、あなたは、このようなHTML表記を使用して、太字や斜体などのいくつかの簡単なスタイリングを、追加することができます。現在サポートされているタグは以下のとおりです。
B
(太字)、I
(イタリック)、U
(下線)、TT
(固定幅)、BIG
、SMALL
、SUP
(上付き)、SUB
(添字)、およびSTRIKE
(取り消し線)。したがって、たとえば、res/values/strings.xml
にあなたがこれを宣言することができます:<resource> <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string> </resources>
(からhttp://developer.android.com/guide/faq/commontasks.html#selectingtext に! - Webアーカイブリンク、<resource>
タイプミスがオリジナルである)
またHtml.fromHtml
は本当に簡単な例で必要とされないことを示しています。
私は同じ問題に実行していました。私はfromHtmlを使用することができますが、私は今アンドロイド午前、ないウェブので、私はこれを試してみることにしました。私はそれを文字列置換概念を使用して撮影を行いましたけれども、私はこれをローカライズする必要があります。私は、ちょうど他のpeicesをフォーマットし、メインのスタイルをするのTextViewにスタイルを設定します。
私は、これは他の人が同じことを行うために探しに役立ちます願っています - 。これは、フレームワークでより簡単ではありませんなぜ私にはわからない。
私の文字列は次のようになります:
<string name="my_text">{0} You will need a {1} to complete this assembly</string>
<string name="text_sub0">1:</string>
<string name="text_sub1">screwdriver, hammer, and measuring tape</string>
ここではスタイルがあります:
<style name="MainStyle">
<item name="android:textSize">@dimen/regular_text</item>
<item name="android:textColor">@color/regular_text</item>
</style>
<style name="style0">
<item name="android:textSize">@dimen/paragraph_bullet</item>
<item name="android:textColor">@color/standout_text</item>
<item name="android:textStyle">bold</item>
</style>
<style name="style1">
<item name="android:textColor">@color/standout_light_text</item>
<item name="android:textStyle">italic</item>
</style>
ここに私のformatStylesメソッドを呼び出して、私のコードは次のとおりです。
SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);
のフォーマット方法:
private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{
String tag0 = "{0}";
int startLocation0 = value.indexOf(tag0);
value = value.replace(tag0, sub0);
String tag1 = "{1}";
int startLocation1 = value.indexOf(tag1);
if (sub1 != null && !sub1.equals(""))
{
value = value.replace(tag1, sub1);
}
SpannableString styledText = new SpannableString(value);
styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
if (sub1 != null && !sub1.equals(""))
{
styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return styledText;
}
今<b>
要素が廃止されました。 <strong>
は<b>
としてレンダリングし、<em>
は<i>
としてレンダリングします。
tv.setText(Html.fromHtml("<strong>bold</strong> and <em>italic</em> "));
これが私のために罰金に動作します。
あなたはのTextViewを拡張するカスタムビューを作成してのsetText()をオーバーライドすることができ、XMLに書式付きテキストを追加できるようにしたい場合:
public class HTMLStyledTextView extends TextView
{
public HTMLStyledTextView(Context context) {
super(context);
}
public HTMLStyledTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HTMLStyledTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setText(CharSequence text, BufferType type)
{
super.setText(Html.fromHtml(text.toString()), type);
}
}
次に、あなたは(あなたのパッケージ名を持つPACKAGE_NAME
を置き換え)このようにそれを使用することができます:
<PACKAGE_NAME.HTMLStyledTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="<![CDATA[
<b>Bolded Text:</b> Non-Bolded Text
]]>"
/>
ここで使用してそれを行うための簡単な方法がある HTMLBuilder の
myTextView.setText(new HtmlBuilder().
open(HtmlBuilder.Type.BOLD).
append("Some bold text ").
close(HtmlBuilder.Type.BOLD).
open(HtmlBuilder.Type.ITALIC).
append("Some italic text").
close(HtmlBuilder.Type.ITALIC).
build()
);
結果:
を一部太字のの一部斜体の
に述べたように、使用TextView.setText(Html.fromHtml(String))
そして、あなたのHTML形式の文字列でこれらのタグを使用します:
<a href="...">
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div align="...">
<em>
<font size="..." color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i>
<img src="...">
<p>
<small>
<strike>
<strong>
<sub>
<sup>
<tt>
<u>
ます。http:// commonsware。 COM /ブログ/アンドロイド/ 2010/5月26日/ htmlのタグ・サポート・バイ・textview.htmlする
私も
Kotlin で美しいマークアップを使用してみてはいかがでしょうか あんこ -
import org.jetbrains.anko.*
override fun onCreate(savedInstanceState: Bundle?) {
title = "Created with Beautiful Markup"
super.onCreate(savedInstanceState)
verticalLayout {
editText {
hint = buildSpanned {
append("Italic, ", Italic)
append("highlighted", backgroundColor(0xFFFFFF00.toInt()))
append(", Bold", Bold)
}
}
}
}
することは可能で利用 SpannedString
.ご利用の場合Kotlinりもしやすいよ core-ktx
, で提供 ドメイン固有の言語(DSL) その為には:
val string: SpannedString = buildSpannedString {
bold {
append("1111")
}
append("Devansh")
}
り提供されているオプションでは:
append("Hello There")
bold {
append("bold")
italic {
append("bold and italic")
underline {
append("then some text with underline")
}
}
}
出したりすることも可能です:
textView.text = string
実際には、HTMLオブジェクトを除いて、あなたはまた、例えば、Spannable型クラスを使用することができますTextAppearanceSpanまたはテーマと連動TypefaceSpanとSpannableString。 HTML形式のクラスでは、これらのメカニズムを使用しています。しかしSpannable型クラスで、あなたはより多くの自由をしました。
String の length() メソッドを利用するのと同じくらい簡単かもしれません。
Strings XML ファイル内のテキスト文字列を、さまざまなスタイルが必要な数のサブ文字列 (Android の観点からは別個の文字列) に分割します。次のようになります。 str1、str2、str3 (あなたの場合のように)、結合すると、使用する単一の文字列全体になります。
そして、コードで提示したのと同じように、単に「Span」メソッドに従います。ただし、単一の文字列の代わりに、すべての部分文字列を結合して、それぞれが異なるカスタム スタイルを持つ単一の文字列にマージします。
数値は引き続き使用しますが、直接使用するわけではありません。数値は (コードのように) ハードコードされた形式ではなくなり、結合された length() メソッドで置き換えられます (str の前後に 2 つの星があることに注意してください)。絶対数の代わりに length() を使用して変更を消去します):
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, **str.length()**, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
最初の文字列サイズの場合、 str.length() + 1、str.length() + str2.length() 2 番目の文字列サイズなど、すべての部分文字列を使用します。0、7、8、19 など...
Androidの文字列リソースのような補助Spannableクラスの使用Webページの一番下に株式。あなたはcreatingCharSquences
、それらにスタイルを与えることによって、これをアプローチすることができます。
しかし、彼らは私たちを与える例では、単に太字、斜体のためであり、さらにテキストを色付け。私はCharSequence
でそれらを設定するためにaTextView
でいくつかのスタイルをラップする必要がありました。だから、そのクラスに(私はそれがCharSequenceStyles
という名前の)私はこの機能を追加しました。
public static CharSequence applyGroup(LinkedList<CharSequence> content){
SpannableStringBuilder text = new SpannableStringBuilder();
for (CharSequence item : content) {
text.append(item);
}
return text;
}
そして、ビューで、私はこれを追加します。
message.push(postMessageText);
message.push(limitDebtAmount);
message.push(pretMessageText);
TextView.setText(CharSequenceStyles.applyGroup(message));
私は願って、このヘルプあなた!
Spanny を使用する方が簡単SpannableString行います。
Spanny spanny = new Spanny("Underline text", new UnderlineSpan())
.append("\nRed text", new ForegroundColorSpan(Color.RED))
.append("\nPlain text");
textView.setText(spanny)
ジョンは私のために、これが最善の解決策であり、あなたが設定する必要がいけない、の言ったように実行時に任意のテキスト、これだけのカスタムクラスを使用HtmlTextView
public class HtmlTextView extends TextView {
public HtmlTextView(Context context) {
super(context);
}
public HtmlTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
}
@TargetApi(21)
public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setText(CharSequence s,BufferType b){
super.setText(Html.fromHtml(s.toString()),b);
}
}
とのthatsそれは、今、あなたのXMLにそれを置く
<com.fitc.views.HtmlTextView
android:id="@+id/html_TV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/example_html" />
をHTML文字列と
<string name="example_html">
<![CDATA[
<b>Author:</b> Mr Donuthead<br/>
<b>Contact:</b> me@donut.com<br/>
<i>Donuts for life </i>
]]>