Jak podkreślić tekst w Android XML?

108

Jak podkreślić tekst w pliku XML? Nie mogę znaleźć opcji w textStyle.

Michael Zeuner
źródło
Spróbuj użyćstyle="text-decoration: underline;"
ρяσѕρєя K
1
czy powinieneś w pełni jak tego używać?
Michael Zeuner
Spróbuj tegotextView.setText(Html.fromHtml("<u>"+"testest"+"</u>"));
ρяσѕρєя K

Odpowiedzi:

174

Jeśli korzystasz z pliku XML zasobów ciąg (obsługuje znaczniki HTML), można to zrobić za pomocą <b> </b>, <i> </i>i <u> </u>.

<resources>
    <string name="your_string_here">
        This is an <u>underline</u>.
    </string>
</resources>

Jeśli chcesz coś podkreślić z kodu użyj:

TextView tv = (TextView) view.findViewById(R.id.tv);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
tv.setText(content);

Mam nadzieję że to pomoże

George Artemiou
źródło
9
Próbowałem tego. ciąg nie jest podkreślony?
Michael Zeuner
5
Spotkałem się z przypadkami, w których bazowanie za pomocą <u>tagów nie działa, np. Czasami, jeśli używasz niestandardowej czcionki. Jednak programistyczny program by UnderlineSpannigdy nie zawiódł, więc poleciłbym to jako najbardziej niezawodne rozwiązanie.
Giulio Piancastelli
Nie musisz ustawiać tekstu w Javie. Po prostu użyj <u>i <\u>w XML i wystarczy.
Maksim Dmitriev
9
w moim przypadku Android Studio Preview nie był w stanie określić tagu HTML. ale kiedy uruchomiłem projekt na prawdziwym urządzeniu, podkreślony tekst został pokazany szczęśliwie.
Alvin
1
<whine> fakt, że musisz przekonwertować ciąg znaków na HTML, gdy Google już podaje nam pogrubienie / kursywa / normalne, jest dość luźny, biorąc pod uwagę, że mamy Androida od ponad 5 lat ... </
whine
57

Użyj tego:

TextView txt = (TextView) findViewById(R.id.Textview1);
txt.setPaintFlags(txt.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
abh22ishek
źródło
Należy pamiętać, że to rozwiązanie zawsze podkreśla cały tekst, więc nie jest możliwe, jeśli chce się podkreślić tylko jego część. Do tego potrzebujesz UnderlineSpan.
Giulio Piancastelli
25
<resource>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Jeśli to nie zadziała, to

<resource>
<string name="your_string_here">This is an &lt;u>underline&lt;/u>.</string>

Ponieważ „<” może być kiedyś słowem kluczowym.

I do wyświetlania

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.your_string_here)));
Bhavin
źródło
3
To działa ... ale jeśli z jakiegoś powodu ustawisz TextView tak, aby używał atrybutu xml android: textAllCaps = "true", podkreślenie nie pojawi się. Usuń ten modyfikator, a podkreślenie będzie wyświetlane zgodnie z przeznaczeniem. Tylko jedna uwaga :)
Matt W
5

Najpierw przejdź do pliku String.xml

możesz dodać tutaj dowolne atrybuty HTML, takie jak kursywa, pogrubienie lub podkreślenie.

    <resources>
        <string name="your_string_here">This is an <u>underline</u>.</string>
    </resources>
AndroidGeek
źródło
3

Innym sposobem jest stworzenie własnego komponentu rozszerzającego TextView. Jest to dobre w przypadkach, w których potrzebujesz wielu podkreślonych TextViews.

Oto kod komponentu:

package com.myapp.components;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;

public class LinkTextView extends AppCompatTextView {
    public LinkTextView(Context context) {
        this(context, null);
    }

    public LinkTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        SpannableString content = new SpannableString(text);
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);

        super.setText(content, type);
    }
}

I jak go używać w xml:

<com.myapp.components.LinkTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
Tharkius
źródło
2

Aby ukończyć odpowiedź Bhavina. Na przykład, aby dodać podkreślenie lub przekierowanie.

((TextView) findViewById(R.id.tv_cgu)).setText(Html.fromHtml(getString(R.string.upload_poi_CGU)));

<string name="upload_poi_CGU"><![CDATA[ J\'accepte les <a href="">conditions générales</a>]]></string>

i możesz poznać kompatybilny tag tutaj: http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html

Anthone
źródło
2

Można użyć poniższego znaczników, ale należy pamiętać, że jeśli ustawić textAllCapsdo trueefektu podkreślenia zostaną usunięte.

<resource>
    <string name="my_string_value">I am <u>underlined</u>.</string>
</resources>


Uwaga

Używanie textAllCaps z ciągiem znaków (login_change_settings), który zawiera znaczniki; znacznik zostanie usunięty podczas konwersji kapsli

Przekształcenie tekstu textAllCaps zakończy się wywołaniem metody toString w CharSequence, co ma efekt netto w postaci usunięcia wszelkich znaczników, takich jak. To sprawdzenie szuka użycia ciągów zawierających znaczniki, które również określają textAllCaps = true.

Tebo
źródło
2

Istnieją różne sposoby uzyskania podkreślonego tekstu w Android TextView.

1. <u>This is my underlined text</u> lub

I just want to underline <u>this</u> word

2. Możesz zrobić to samo programowo.

`textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);`

Można to zrobić, tworząc SpannableString, a następnie ustawiając go jako właściwość TextView

SpannableString text = new SpannableString("Voglio sottolineare solo questa parola");
text.setSpan(new UnderlineSpan(), 25, 6, 0);
textView.setText(text);
Anandharaj R
źródło
2

Użyłem poniższej metody, to zadziałało. Poniżej znajduje się przykład dla przycisku, ale możemy go również użyć w TextView.

Button btnClickMe = (Button) findViewById(R.id.btn_click_me);
btnClickMe.setPaintFlags(btnClickMe.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Hitesh Dhamshaniya
źródło
1

Jeśli chcesz porównać tekst Ciąg lub tekst zmieni się dynamicznie, możesz utworzyć widok w układzie Ograniczenia, który dostosuje się do długości tekstu w ten sposób

 <android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txt_Previous"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text="Last Month Rankings"
        android:textColor="@color/colorBlue"
        android:textSize="15sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        android:layout_width="0dp"
        android:layout_height="0.7dp"
        android:background="@color/colorBlue"
        app:layout_constraintEnd_toEndOf="@+id/txt_Previous"
        app:layout_constraintStart_toStartOf="@+id/txt_Previous"
        app:layout_constraintBottom_toBottomOf="@id/txt_Previous"/>


</android.support.constraint.ConstraintLayout>
MazRoid
źródło
0
public void setUnderLineText(TextView tv, String textToUnderLine) {
        String tvt = tv.getText().toString();
        int ofe = tvt.indexOf(textToUnderLine, 0);

        UnderlineSpan underlineSpan = new UnderlineSpan();
        SpannableString wordToSpan = new SpannableString(tv.getText());
        for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
            ofe = tvt.indexOf(textToUnderLine, ofs);
            if (ofe == -1)
                break;
            else {
                wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

Najłatwiejszy sposób

TextView tv = findViewById(R.id.tv);
tv.setText("some text");
setUnderLineText(tv, "some");

Obsługuje również elementy potomne TextView, takie jak EditText, Button, Checkbox

Jeśli chcesz

- Tekst podkreślony, który można kliknąć?

- Podkreślić wiele części TextView?

Następnie sprawdź tę odpowiedź

Khemraj
źródło