Android düzeninde metnin altını çizebilir miyim?


Yanıtlar:


1144

Bu bir kullanıyorsanız elde edilebilir dize kaynak HTML etiketleri gibi destekler xml dosyası, <b></b>, <i></i>ve <u></u>.

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

Kod kullanımından bir şeyin altını çizmek istiyorsanız:

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

49
Merhaba, yukarıdaki kaynak xml kodunu denedim ve bu işe yaramaz. <u> alt çizgiyi </u> düz bir metin olarak göstermeye devam etti
Jonathan

4
Ayrıca bkz: bir Spanned döndüren android.text.Html.fromHtml ().
Mark Renouf

3
Ekle düğmesi ile yapmamak yerine, strings.xml dosyasının kendisine yazmalısınız. Aksi takdirde bunu elde edersiniz & lt; u & gt; strings.xml dosyanızda ve kodunuzda <u> altı çizili </u>
gdrt

3
<u>Örneğin, özel bir yazı tipi kullanıyorsanız, bazen etiketlerin altında çalışmama durumları ile karşılaştım . Ancak, programlı olarak altta yatan UnderlineSpanhenüz benim başarısız olmadı, bu yüzden en güvenilir çözüm olarak tavsiye ederim.
Giulio Piancastelli

26
Editörde gösterilmez, ancak Uygulamayı başlattığınızda altı çizilir.
jean d'arme

534

İle deneyebilirsiniz

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);

1
Belki küçük bir nokta, ama OP XML düzen dosyasında tanımlanmasını istedi; aksi takdirde, bu harika bir çözümdür.
kwishnu

4
temizlemek için bu çözümü kullanın
Bobs

2
Bu çözüm bir Düğme için de kullanılabilir
Rudy Kurniawan

3
Özel yazı tipleri veya benzeri bir şey kullanıyorsanız dikkatli olmanız gerekebilir, | Paint.ANTI_ALIAS_FLAGaksi takdirde metniniz çok keskin görünecektir. Bu, daha düşük API'larda daha sık görülür.
Martin Marconcini

4
Kotlin'de:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Albert Vila Calvo

72

Yukarıdaki "kabul" cevabı yok DEĞİL sizin gibi dize kullanmaya çalıştığınızda (iş textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Belgelerde belirtildiği gibi , iç etiketlerin açılış braketinden kaçmanız (html varlık kodlu) &lt;, örneğin sonuç şöyle görünmelidir:

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

Daha sonra kodunuzda metni aşağıdakilerle ayarlayabilirsiniz:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

4
<u> burada altı çizili </u> mükemmel çalışıyor. <u> alt çizgi </> çalışmadı. Bu Android 2.2 içindir. Belki farklı versiyonlar bunu farklı yorumlar.
user898763452

@autotravis hangisi 2.2? Eski sürümlerde test etmedim ve farklı sürümler farklı işlerse oldukça talihsiz olacaktır ... Ayrıca en azından mevcut belgeler kaçması gerektiğini belirtir (bağlantı cevapta).
Ognyan

Android 2.3 üzerinde <u> altı çizili </u> test ettim ve işe yarıyor. <u> alt çizgi </ u> 2.3 için çalışmaz. Dokümanlar "Bazen biçim dizesi olarak da kullanılan stilize bir metin kaynağı oluşturmak isteyebilirsiniz. Normalde, String.format (String, Object ...) yöntemi tüm stil bilgilerini şeritleyeceği için bu çalışmaz Bunun geçici çözümü, biçimlendirme gerçekleştikten sonra fromHtml (String) ile kurtarılan, çıkış etiketli objelerle HTML etiketlerini yazmaktır. " Bu yüzden eğer o String.format (...) yöntemi ile çalıştırırsanız kaçan kullanırsınız sanırım.
user898763452

@autotravis evet, haklısın. String.format (...) ile kullanıyorum. Cevabımı düzenledim, geri bildiriminiz için teşekkür ederim.
Ognyan

2.3 ve 4.1 (şimdiye kadar denedim) sadece getString (), Html.fromHtml () ve String.format () kullanmak yerine textView.setText (getText (R.string.text)) kullanabilirsiniz.
Roy Solberg

59

Strings.xml dosya içeriği:

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

Düzen xml dosyası, aşağıda gösterildiği gibi, metin görünümünün aşağıdaki özelliklerine sahip yukarıdaki dize kaynağını kullanacaktır:

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/my_text"

    android:selectAllOnFocus="false"
    android:linksClickable="false"
    android:autoLink="all"
    />

3
Dizgi kaynak dosyasını Eclipse'deki yardımcı düzenleme kullanıcı arayüzünün yerine gerçek XML içinde düzenlediğinizden emin olun.
Chris Rae

51

Button ve TextView için bu en kolay yol:

Buton:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Metin görünümü:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Çok zarif bir çözüm. Teşekkür ederim!
Adrian

20

Tek hat çözümü

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

Biraz geç oldu ama birisi için yararlı olabilir.


19

Kotlin'de uzatma fonksiyonu kullanılabilir. Bu yalnızca koddan kullanılabilir, xml değil.

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

Kullanımı:

 tv_change_number.underline()
 tv_resend_otp.underline()

13

altı çizili tıklanabilir düğme stilini kontrol edin:

<TextView
    android:id="@+id/btn_some_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_add_contact"
    android:textAllCaps="false"
    android:textColor="#57a0d4"
    style="@style/Widget.AppCompat.Button.Borderless.Colored" />

strings.xml:

<string name="btn_add_contact"><u>Add new contact</u></string>

Sonuç:

resim açıklamasını buraya girin


Widget.AppCompat.Button.Borderless.Colored'in görünümü ve hissi, alt çizgiden çok daha iyidir, ancak @Kiril Vashilo'nun açıkladığı gibi, yine de yapabilirsiniz.
xarlymg89

11

Altı çizili metnin çizilmesine ilişkin en son yaklaşım , GitHub'da kullanılabilir kaynak kodunun bulunduğu ortamda Romain Guy tarafından tanımlanmıştır . Bu örnek uygulama iki olası uygulamayı ortaya koymaktadır:

  • API düzeyi 19 gerektiren Yol tabanlı bir uygulama
  • API düzeyi 1 gerektiren Bölge tabanlı bir uygulama

resim açıklamasını buraya girin


10

Bunun geç bir cevap olduğunu biliyorum, ama oldukça iyi çalışan bir çözüm buldum ... Koddaki metnin altını çizmek için Anthony Forloney'den yanıtı aldım ve sizin için işleyen bir TextView alt sınıfı oluşturdum. Sonra altı çizili bir TextView olmasını istediğinizde XML'de alt sınıfı kullanabilirsiniz.

İşte oluşturduğum sınıf:

import android.content.Context;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created with IntelliJ IDEA.
 * User: Justin
 * Date: 9/11/13
 * Time: 1:10 AM
 */
public class UnderlineTextView extends TextView
{
    private boolean m_modifyingText = false;

    public UnderlineTextView(Context context)
    {
        super(context);
        init();
    }

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

    public UnderlineTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    private void init()
    {
        addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if (m_modifyingText)
                    return;

                underlineText();
            }
        });

        underlineText();
    }

    private void underlineText()
    {
        if (m_modifyingText)
            return;

        m_modifyingText = true;

        SpannableString content = new SpannableString(getText());
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
        setText(content);

        m_modifyingText = false;
    }
}

Şimdi ... XML'de altı çizili bir metin görünümü oluşturmak istediğinizde, aşağıdakileri yapmanız yeterlidir:

<com.your.package.name.UnderlineTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:text="This text is underlined"
    android:textColor="@color/blue_light"
    android:textSize="12sp"
    android:textStyle="italic"/>

Örneğimin metin rengini, boyutunu ve stilini değiştirerek çalıştığını göstermek için bu XML snippet'inde ek seçenekler ekledim ...

Bu yardımcı olur umarım!


2
Bu örnek çalışıyor olsa da, XML'de bunun yapmayacağı ek bir kontrole sahip olmak istiyorsanız ... Aşağıdaki adımları içeren daha iyi bir çözüme geçtim: 1) Alt sınıf metin görünümü 2) Destek ekle yukarıda belirtildiği gibi alt çizgiyi yapmak için metnin özel niteliklerle altını çizmek. Tek fark, alt çizgi kodunu yalnızca özel öznitelik ayarlanmışsa yürütmenizdir.
Justin

10


textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); Yöntem yerine daha temiz bir yol kullanmaktır textView.getPaint().setUnderlineText(true);

Ve daha sonra bir RecyclerView uygulamasında yeniden kullanılan görünümde olduğu gibi bu görünümün altını çizmeyi kapatmanız gerekirse, textView.getPaint().setUnderlineText(false);


7

Özniteliği dize kaynak dosyasında kullanmanız yeterlidir;

<string name="example"><u>Example</u></string>

7

Bir alt kenarlık oluşturmak için bu xml çizilebilir kullandım ve metin görünümünde çizilebilir arka plan olarak uygulandı

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

    <item android:top="-5dp" android:right="-5dp" android:left="-5dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                    android:width="1.5dp"
                    android:color="@color/pure_white" />
        </shape>
    </item>
</layer-list>

bu, özel renkle vurgulanan tüm görünümler için mükemmel bir çözümdür. Burada şeffaf arka planı saygısızlık etmeyin, android 4 için gereklidir, görünümünüz o
olmadan

5

XML'de basit ve esnek bir çözüm:

<View
  android:layout_width="match_parent"
  android:layout_height="3sp"
  android:layout_alignLeft="@+id/your_text_view_need_underline"
  android:layout_alignRight="@+id/your_text_view_need_underline"
  android:layout_below="@+id/your_text_view_need_underline"
  android:background="@color/your_color" />

4

başka bir çözüm, aşağıda gösterildiği gibi TextView'i genişleten özel bir görünüm oluşturmaktır

public class UnderLineTextView extends TextView {

    public UnderLineTextView(Context context) {
        super(context);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

    public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

}

ve sadece aşağıda gösterildiği gibi xml'ye ekleyin

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

Korku veren !! Ama alt çizginin rengi gri, siyah veya başka bir renge nasıl değiştirilir?
OhhhThatVarun

3

Samuel'in cevabını basitleştirdim :

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--https://stackoverflow.com/a/40706098/4726718-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

3

Bu yöntemi kolaylıkla yarattım

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

Tüm TextView öğesinin altını çiz

setUnderLineText(tv, tv.getText().toString());

TextView öğesinin bir bölümünün altını çizin

setUnderLineText(tv, "some");

Ayrıca EditText, Button, Checkbox gibi TextView alt öğelerini de destekleyin

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

tıklanabilir alt çizgi metnini yapmak veya TextView'un birden çok bölümünün altını çizmek için cevabımı kontrol edin


2

bu kodu dene

XML'de

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

Kodda

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

İyi şanslar!


2
  1. Strings.xml kaynak dosyasına gidin
  2. Kaynak dosyaya gerektiğinde HTML alt çizgi etiketi içeren bir dize ekleyin.

strings.xml HTML alt çizgi örneği

  1. Java kodunuzdaki dize kaynak kimliğini aşağıdaki gibi arayın:
sampleTextView.setText(R.string.sample_string);
  1. Çıktıda "Stackoverflow" sözcüğü altı çizili olmalıdır.

Ayrıca, aşağıdaki kod alt çizgiyi yazdırmaz:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

Bunun yerine, zengin metin biçimini korumak için aşağıdaki kodu kullanın:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"Bir dize almak için getString (int) veya getText (int) kullanabilirsiniz. GetText (int), dizeye uygulanan zengin metin stillerini korur." Android belgeleri.

Belgelere bakın: https://developer.android.com/guide/topics/resources/string-resource.html

Umarım bu yardımcı olur.


2

En çok oy alan cevap doğru ve basittir. Ancak, bazen bunun bazı yazı tipleri için değil, diğerleri için çalıştığını görebilirsiniz. (Çince ile uğraşırken hangi problemle karşılaştım.)

Çözüm, yalnızca TextView için "WRAP_CONTENT" kullanmayın, çünkü çizgi çizmek için fazladan alan yoktur. TextView için sabit yükseklik ayarlayabilir veya WRAP_CONTENT ile android: paddingVertical kullanabilirsiniz.


1
HtmlCompat.fromHtml(
                    String.format(context.getString(R.string.set_target_with_underline)),
                    HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline">&lt;u>Set Target&lt;u> </string>

Xml dosyasındaki Escape sembolünü not edin


kaçış sembolleri ile benim için çalıştı, teşekkürler!
Badr

1

Kotlin'de bunu yapmak için:

yourTextView.paint?.isUnderlineText = true


0

Bunu cevaplamak için oldukça geç ama herkes metni dinamik olarak almak istiyorsa, o zaman java kodunda çalışan bu basit bir satırı kullanabilir:

 textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));

-2

Özel bir yazı tipi ve kaynak dosya hilesi (<u>Underlined text</u> ) işe yaradı ama Android altı çizili bir grev yalak dönüştürmek başardı.

Bu yanıtı, metin görünümünün altına bir kenarlık çizmek için kullandım: https://stackoverflow.com/a/10732993/664449 . Açıkçası bu, kısmen altı çizili metin veya çok satırlı metin için çalışmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.