Aby narysować podkreślenie poniżej TextView w systemie Android

118

Chcę narysować podkreślenie poniżej mojego TextView. Przeszukałem kilka treści, ale nie znalazłem nic owocnego.

Czy ktoś może mi tutaj pomóc?

David Brown
źródło
2
5 sposobów na podkreślenie
widoku tekstowego w systemie

Odpowiedzi:

323

Istnieją trzy sposoby podkreślania tekstu w TextView.

  1. SpannableString

  2. setPaintFlags (); TextView

  3. Html.fromHtml ();

Pozwól, że wyjaśnię ci wszystkie podejścia:

Podejście 1

Aby podświetlić tekst w TextView, musisz użyć SpannableString

String udata="Underlined Text";
SpannableString content = new SpannableString(udata);
content.setSpan(new UnderlineSpan(), 0, udata.length(), 0);
mTextView.setText(content);

Podejście 2

Możesz skorzystać z metody setPaintFlags TextView , aby podkreślić tekst TextView.

Np.

mTextView.setPaintFlags(mTextView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
mTextView.setText("This text will be underlined");

Możesz odwołać się do stałych klasy Paint, jeśli chcesz przekreślić tekst.

Trzecie podejście

Zrobić użytek z Html.fromHtml(htmlString);

String htmlString="<u>This text will be underlined</u>";
mTextView.setText(Html.fromHtml(htmlString));

LUB

txtView.setText(Html.fromHtml("<u>underlined</u> text"));
Kartik Domadiya
źródło
1
Miło mi to słyszeć… Oznacz to pytanie jako rozwiązane, aby inni użytkownicy mogli je polecić.
Kartik Domadiya
4
Html.fromHtml("<u>This text will be underlined</u>")Przydałoby się trzecie podejście , ale muszę przyznać, że jestem znacznie większym fanem używania SpannableStrings. @Kartik: Równie dobrze możesz użyć znaku StrikethroughSpanw tekście, aby stworzyć efekt przekreślenia. :)
MH.
Uwielbiam trzecie podejście. Krótki, prosty i zwięzły oraz dodaje tylko jedną dodatkową linię kodu do mojego programu.
Matt,
Wiem, że to trochę stare, ale czy istnieje sposób na ustawienie grubości podkreślenia?
Andreas Wong,
która z nich jest używana dla zawartości preferencjiActivity w kategorii PreferenceCategory?
programista Androida
40

po prostu otocz swój tekst znacznikiem <u> w pliku zasobów string.xml

<string name="your_string"><u>Underlined text</u></string>

oraz w swojej aktywności / fragmencie

mTextView.setText(R.string.your_string);
Sarpe
źródło
7
@CHAKRAVARTHI to nie zadziała, jeśli przerzucisz tekst na ciąg przed ustawieniem. Np. textView.setText(getString(R.string.text)) <- źle . Racja: textView.setText(getText(R.string.text)) lub po prostu textView.setText(R.string.text). Powodem beind to, że getText()wraca Spannablez podkreślają przęseł, ale jeśli używasz getString()to przekonwertować Spannabledo Stringwynikających przęseł zostanie usunięty.
Yaroslav Mytkalyk
Słuszna uwaga! Zredagowałem moją obecną odpowiedź, aby była bardziej przejrzysta
Sarpe
19

U mnie to działa.

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
mani
źródło
11

Dla każdego, kto wciąż patrzy na to pytanie. To jest dla hiperłącza, ale możesz je zmodyfikować, aby uzyskać zwykłe podkreślenie:

Utwórz do rysowania (hyperlink_underline.xml):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:top="-10dp"
        android:left="-10dp"
        android:right="-10dp">
    <shape android:shape="rectangle">
      <solid android:color="@android:color/transparent"/>

      <stroke android:width="2dp"
              android:color="#3498db"/>
    </shape>
  </item>
</layer-list>

Utwórz nowy styl:

<style name="Hyperlink">
    <item name="android:textColor">#3498db</item>
    <item name="android:background">@drawable/hyperlink_underline</item>
  </style>

Następnie użyj tego stylu w swoim TextView:

<TextView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    local:MvxBind="Text Id; Click ShowJobInfoCommand"
    style="@style/HyperLink"/>
Daniel
źródło
3

Jeśli Twój TextView ma stałą szerokość, alternatywnym rozwiązaniem może być utworzenie widoku, który będzie wyglądał jak podkreślenie i umieszczenie go bezpośrednio pod TextView.

<RelativeLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent">

        <TextView
            android:id="@+id/myTextView"
            android:layout_width="20dp"
            android:layout_height="wrap_content"/>

        <View
            android:layout_width="20dp"
            android:layout_height="1dp"
            android:layout_below="@+id/myTextView"
            android:background="#CCCCCC"/>
</RelativeLayout>
Lera
źródło
2

Prostym i trwałym rozwiązaniem jest utworzenie listy warstw i ustawienie jej jako tła dla TextView:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>
Darush
źródło
2
Jest to najlepszy wybór, jeśli jest to jednowierszowy
widok tekstu
0

podkreśl widok tekstu w systemie Android

5 niesamowitych sposobów podkreślenia TextView w Androidzie - Kotlin / Java i XML

  1. String html = "<u>Underline using Html.fromHtml()</u>"; textview.setText(Html.fromHtml(html));

Ale Html.fromHtml (zasób String) został wycofany w API 24.

Możesz więc skorzystać z najnowszej biblioteki obsługi Androida androidx.core.text.HtmlCompat . Wcześniej musisz uwzględnić zależność w swoim projekcie.

`implementation 'androidx.core:core:1.0.1'`
  1. String html = "<u> 1.1 Underline using HtmlCompat.fromHtml()</u>"; //underline textview using HtmlCompat.fromHtml() method textview11.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY));

Używając strings.xml ,

  1. <string name="underline_text">1.3 &lt;u>Underline using HtmlCompat.fromHtml() and string resource&lt;/u></string>

textview13.setText(HtmlCompat.fromHtml(getString(R.string.underline_text), HtmlCompat.FROM_HTML_MODE_LEGACY));

używając PaintFlags

  1. textview2.setPaintFlags(textview2.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); textview2.setText("2. Underline using setPaintFlags()");

przy użyciu SpannableString

`String content1 = "3.1 Underline using SpannableString";
        SpannableString spannableString1 = new SpannableString(content1);
        spannableString1.setSpan(new UnderlineSpan(), 0, content1.length(), 0);
        textview31.setText(spannableString1);`
Vijay Ram
źródło