Frage

Ist es möglich, mehrere Stile für verschiedene Teile von text in TextView?

Zum Beispiel, ich bin Einstellung, die den text wie folgt:

tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);

Ist es möglich zu haben ein anderer Stil für jeden text element?E. g., line1 Fett, word1 Kursiv, etc.

Die developer ' s guide Allgemeine Aufgaben und Wie Sie in Android gehören Auswählen, Markieren, oder Styling-Teile-Text:

// 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);

Aber das nutzt expliziten Positionsnummern im text.Gibt es eine sauberere Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Im Fall jemand fragt sich, wie dies zu tun, hier ist ein Weg: (Danke an Mark wieder)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
            "<small>" + description + "</small>" + "<br />" + 
            "<small>" + DateAdded + "</small>"));

Für eine inoffizielle Liste von Tags, die von dieser Methode unterstützt wird, finden Sie unter Link oder diese Frage:

Andere Tipps

Versuchen Html.fromHtml(), und markieren Sie Ihren Text mit fett und kursiv HTML-Tags z:

Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff");
textView.setText(text);

Etwas off-topic, aber ich fand, dass dies auch nützlich, hier nicht erwähnt werden.

Was ist, wenn wir Lesen möchte, die den Html-text aus string.xml Ressourcen-und damit machen es einfach zu lokalisieren. CDATA die dies möglich machen:

<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> 

Von unserem Java-code konnten wir jetzt nutzen Sie es wie folgt:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text))); 

Ich wusste nicht, dass das funktionieren wird.Aber er Tat es.

Hoffe, es ist hilfreich für einige von Euch!

Wenn Sie mit HTML nicht das Gefühl, könnten Sie einfach eine styles.xml schaffen und es wie folgt verwendet werden:

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);

Es ist geringes Gewicht eine SpannableString statt HTML-Markup zu verwenden. Es hilft mir, visuelle Beispiele, so ist hier eine ergänzende Antwort zu sehen.

 image description hier

eingeben

Dies ist eine einzige 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());

Weitere Studie

Dieses Beispiel wurde ursprünglich inspiriert von hier .

Die Liste der unterstützten Tags lautet:

  

Wenn Sie eine Zeichenfolge-Ressource verwenden, können Sie einige einfache Styling, wie fett oder kursiv mit HTML-Notation hinzuzufügen. Die derzeit unterstützten Tags sind: B (fett), I (kursiv), U (unterstrichen), TT (Monospace), BIG, SMALL, SUP (Exponent), SUB (Index) und STRIKE (gestrichener). So zum Beispiel in res/values/strings.xml Sie könnte dies erklären:

<resource>
    <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

(Aus http://developer.android.com/guide/faq/commontasks.html#selectingtext - Webarchiv Link, <resource> Tippfehler im Original)

Es zeigt auch, dass Html.fromHtml nicht wirklich in einfachen Fällen erforderlich ist.

Ich lief in das gleiche Problem. Ich konnte verwenden fromHtml, aber ich bin android jetzt, nicht Web, so dass ich diese ausprobieren entschieden. Ich habe dies aber zu lokalisieren, damit ich ihm einen Schuss mit String-Ersatz Konzept gab. Ich habe den Stil auf der Textview der Haupt Stil zu sein, dann formatiert werden nur die anderen Peices.

Ich hoffe, das hilft andere suchen, das Gleiche zu tun. - Ich weiß nicht, warum dies nicht einfacher im Rahmen ist

Meine Strings wie folgt aussehen:


<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>

Hier sind die Stile:


<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>

Hier ist mein Code, der meine formatStyles Methode aufruft:


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);

Das Format Methode:


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;
}

Nun wird das <b> Element veraltet. <strong> macht als <b> und <em> macht als <i>.

tv.setText(Html.fromHtml("<strong>bold</strong> and <em>italic</em> "));

dies funktioniert gut für mich

Wenn Sie den formatierten Text in XML zu können, fügen Sie eine benutzerdefinierte Ansicht erstellen können Textview und Überschreibung setText erstrecken ():

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);
    }
}

Dann können Sie es wie diese verwenden können (ersetzen PACKAGE_NAME mit Ihrem Paketnamen):

<PACKAGE_NAME.HTMLStyledTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="<![CDATA[
        <b>Bolded Text:</b> Non-Bolded Text
    ]]>"
/>

Dies ist eine einfache Möglichkeit, dies zu tun mit 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()
    );

Ergebnis:

Ein dicker Text Einige kursiver Text

Wie bereits erwähnt, Verwendung TextView.setText(Html.fromHtml(String))

Und verwenden Sie diese Tags in Ihrem HTML-formatierten String:

<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 / blog / Android / 2010/05/26 / html-Tags-unterstützten-by-textview.html

Me Too

Wie wäre es einige schöne Markup mit Kotlin mit und Anko -

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)
            }
        }
    }
}

Ja, es ist möglich, SpannedString verwenden. Wenn Sie Kotlin verwenden, wird es noch einfacher zu tun, indem core-ktx verwenden, da es eine domänenspezifische-Sprache (DSL) dies zu tun:

    val string: SpannedString = buildSpannedString {
        bold {
            append("1111")
        }
        append("Devansh")     
    }

Weitere Optionen durch vorgesehen sind:

append("Hello There")
bold {
    append("bold")
    italic {
        append("bold and italic")
        underline {
            append("then some text with underline")
        }
    }
}

Endlich können Sie einfach an:

textView.text = string

In der Tat, mit Ausnahme der HTML-Objekt, können Sie auch die Spannable Typklassen verwenden können, beispielsweise TextAppearanceSpan oder TypefaceSpan und SpannableString togather. Html-Klasse verwendet, auch diese Mechanismen. Aber mit den Spannable Typklassen, haben Sie mehr Freiheit.

es so einfach sein könnte, die String Länge () -Methode als nutzen:

  1. Split die Textzeichenfolge in der Strings XML-Datei in so viele Unterketten (eine separaten Strings aus Android-Sicht), wie viele Sie verschiedene Arten benötigen, so dass es wie sein könnte: STR1, STR2 , str3 (wie in diesem Fall), die, wenn sie miteinander verbunden sind, die ganze einzelne Zeichenfolge, die Sie verwenden.

  2. Und dann folgen Sie einfach der „Span“ Methode, wie Sie mit Ihrem Code vorgestellt -. Aber statt einer einzigen Saite, vereint alle Teil sie zu einem einzigen verschmelzen, jedes mit einem anderen benutzerdefinierten Stil

Sie noch die Zahlen verwenden, jedoch nicht direkt - sie sind nicht mehr eine hartcodierte Form (wie in Ihrem Code) jetzt, aber sie werden mit der kombinierten Länge () -Methoden (Anmerkung zwei Sterne ersetzt vorhergehenden und suffixing die str.length () anstelle der absoluten Zahl der Änderung extuinguish):

str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, **str.length()**, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

für die erste Saite Größe, dann str.length () + 1, str.length () + str2.length () für die zweite String Größe, und so weiter mit allen Teilketten, statt zB 0,7 oder 8,19 und so weiter ...

Unter Verwendung eines Hilfs Spannable Klasse als Android String-Ressourcen Aktien am unteren Rand der Webseite. Sie können dies durch creatingCharSquences nähern und ihnen einen Stil zu geben.

Aber in dem Beispiel, geben sie uns, ist nur für fett, kursiv, und auch kolorieren Text. Ich brauchte mehrere Stile in aCharSequence, um wickeln Sie sie in einem TextView einzustellen. Also, dass die Klasse (ich nannte es CharSequenceStyles) ich diese Funktion gerade hinzugefügt haben.

public static CharSequence applyGroup(LinkedList<CharSequence> content){
    SpannableStringBuilder text = new SpannableStringBuilder();
    for (CharSequence item : content) {
        text.append(item);
    }
    return text;
}

Und in der Ansicht Ich habe diese.

            message.push(postMessageText);
            message.push(limitDebtAmount);
            message.push(pretMessageText);
            TextView.setText(CharSequenceStyles.applyGroup(message));

Ich hoffe, diese Hilfe Sie!

Spanny machen SpannableString einfacher zu bedienen.

Spanny spanny = new Spanny("Underline text", new UnderlineSpan())
                .append("\nRed text", new ForegroundColorSpan(Color.RED))
                .append("\nPlain text");
textView.setText(spanny)

Wie Jon sagte , für mich dies die beste Lösung ist, und Sie brauchen nicht zu Set beliebiger Text zur Laufzeit, nur diese benutzerdefinierten Klasse verwenden 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);
  }

}

und das ist es, jetzt nur noch in der XML legt es

<com.fitc.views.HtmlTextView
    android:id="@+id/html_TV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_html" />

mit Ihrem HTML-String

<string name="example_html">
<![CDATA[
<b>Author:</b> Mr Donuthead<br/>
<b>Contact:</b> me@donut.com<br/>
<i>Donuts for life </i>
]]>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top