Yanıtlar:
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);
<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 UnderlineSpan
henüz benim başarısız olmadı, bu yüzden en güvenilir çözüm olarak tavsiye ederim.
İle deneyebilirsiniz
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
| Paint.ANTI_ALIAS_FLAG
aksi takdirde metniniz çok keskin görünecektir. Bu, daha düşük API'larda daha sık görülür.
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
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) <
, örneğin sonuç şöyle görünmelidir:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</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), ...)));
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"
/>
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);
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ç:
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:
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!
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);
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>
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" />
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"
/>
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>
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);
}
}
}
sampleTextView.setText(R.string.sample_string);
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.
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.
HtmlCompat.fromHtml(
String.format(context.getString(R.string.set_target_with_underline)),
HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline"><u>Set Target<u> </string>
Xml dosyasındaki Escape sembolünü not edin
Ö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.