Basit HTML kodum var :
<h2>Title</h2><br>
<p>description here</p>
İçinde HTML tarzında metin görüntülemek istiyorum TextView
. Bu nasıl yapılır?
Basit HTML kodum var :
<h2>Title</h2><br>
<p>description here</p>
İçinde HTML tarzında metin görüntülemek istiyorum TextView
. Bu nasıl yapılır?
Yanıtlar:
Html.fromHtml()
XML Dizelerinizde HTML kullanmak için kullanmanız gerekir . Düzen XML'nizde HTML içeren bir Dizeye başvurmanız işe yaramaz.
Yapmanız gerekenler:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}
h2
tanımı gereği kendi etrafında çok fazla marj yaratır. ve p
ayrıca bir miktar marjla birlikte gelir. boşluğu istemiyorsanız, diğer html öğelerini kullanmayı düşünebilirsiniz.
android.text.Html.fromHtml
. Çoğu IDE'nin sizin için düzelteceğini biliyorum, ancak okunabilirlik için paket adlarını bilmek daha güzel.
setText (Html.fromHtml (bodyData)) olduğu kaldırılmış Artık bunu yapmak zorunda API 24. sonrası:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
} else {
tvDocument.setText(Html.fromHtml(bodyData));
}
Şuna bir göz atın: https://stackoverflow.com/a/8558249/450148
Çok iyi !!
<resource>
<string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>
Yalnızca birkaç etiket için çalışır.
Java kodunda herhangi bir değişiklik yapmadan xml ile yapılandırabilmek istiyorsanız bu fikri yararlı bulabilirsiniz. Yapıcıdan init'i çağırmanız ve metni html olarak ayarlamanız yeterlidir
public class HTMLTextView extends TextView {
... constructors calling init...
private void init(){
setText(Html.fromHtml(getText().toString()));
}
}
xml:
<com.package.HTMLTextView
android:text="@string/about_item_1"/>
Bir dize kaynak kimliğinden HTML göstermeye çalışıyorsanız, biçimlendirme ekranda görünmeyebilir. Bu gerçekleşiyorsa, bunun yerine CDATA etiketlerini kullanmayı deneyin:
strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>
...
MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));
Daha fazla ayrıntı için bu gönderiye bakın.
Aşağıdaki kod benim için en iyi sonucu verdi.
TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
SiteLink= (TextView) findViewById(R.id.textViewSite);
SiteLink.setText(Html.fromHtml(value));
SiteLink.setMovementMethod(LinkMovementMethod.getInstance());
Sadece bazı html metinlerini görüntülemek istiyorsanız ve gerçekten a'ya ihtiyacınız yoksa TextView
, a'yı alıp WebView
aşağıdaki gibi kullanın:
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
Bu, sizi birkaç html etiketi ile sınırlamaz.
layout_height="wrap_content"
. Bunun yerine açık bir yükseklik veya match_parent ayarlamanız gerekir.
Html içeriğinin TextView'e gerçek bir görüntüsünü almak için dizeler için CData bölümlerini kullanmak için en iyi yaklaşım Aşağıdaki kod snippet'i size adil bir fikir verecektir.
//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>
//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));
Dize metnindeki CData bölümü, String.format yöntemini kullanarak metni biçimlendirdikten sonra bile html etiketi verilerini korur. Html.fromHtml (str) iyi çalışır ve Hoş Geldiniz iletisinde kalın metni görürsünüz.
Çıktı:
En sevdiğiniz müzik uygulaması mağazasına hoş geldiniz. Giriş tarihi: kullanıcı adı
Html.fromHtml (String source) yönteminin API düzey 24'ten itibaren kullanımdan kaldırıldığını belirtmek gerekir. Hedef API'niz buysa bunun yerine Html.fromHtml (String source, int flags) kullanmalısınız.
Ayrıca aşağıdaki projeyi önermek istiyorum: https://github.com/NightWhistler/HtmlSpanner
Kullanımı neredeyse varsayılan android dönüştürücü ile aynıdır:
(new HtmlSpanner()).fromHtml()
Standart Html.fromHtml, render denetimi üzerinde yeterli esneklik sağlamaz ve hatta ttf'den özel yazı tipleri kullanma imkanı olmadığından, html'nin spannable dönüştürücüye kendi uygulamasından başladıktan sonra buldum.
Bu sorunun eski olduğunu biliyorum. Burada diğer cevaplar Html.fromHtml()
yöntemi önermektedir . Ben Kullanmak önermek HtmlCompat.fromHtml()
gelen androidx.core.text.HtmlCompat
paketin. Html
Sınıfın geriye dönük uyumlu bir versiyonu olduğu için .
Basit kod:
import androidx.core.text.HtmlCompat;
import android.text.Spanned;
import android.widget.TextView;
String htmlString = "<h1>Hello World!</h1>";
Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);
TextView tvOutput = (TextView) findViewById(R.id.text_view_id);
tvOutput.setText(spanned);
Bu şekilde Android API sürüm kontrolünden kaçınabilirsiniz ve kullanımı kolaydır (tek satır çözüm).
Basit kullanım Html.fromHtml("html string")
. Bu çalışacak. Dize gibi etiketler <h1>
varsa boşluklar gelecektir. Ancak bu alanları ortadan kaldıramayız. Yine de boşlukları kaldırmak istiyorsanız, dizedeki etiketleri kaldırabilir ve ardından dizeyi yönteme geçirebilirsiniz Html.fromHtml("html string");
. Ayrıca genellikle bu dizeler sunucudan (dinamik) gelir, ancak sık sık değil, eğer dizeyi metoda olduğu gibi geçirmek daha iyi ise, etiketleri dizeden kaldırmaya çalışmaktan daha iyidir.
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
Gibi küresel bir yöntem yapın:
public static Spanned stripHtml(String html) {
if (!TextUtils.isEmpty(html)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
} else {
return Html.fromHtml(html);
}
}
return null;
}
Ayrıca Faaliyet / Parçanızda aşağıdaki gibi kullanabilirsiniz:
text_view.setText(stripHtml(htmlText));
Bunu web görünümünü kullanarak uyguladım. Benim durumumda metin görünümünde metinle birlikte URL'den resim yüklemem gerekiyor ve bu benim için çalışıyor.
WebView myWebView =new WebView(_context);
String html = childText;
String mime = "text/html";
String encoding = "utf-8";
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
Html framework sınıfının burada önerildiği gibi kullanılması çeşitli cevaplarla önerilmiştir, ancak ne yazık ki bu sınıf, 214637 , 14778 , 235128 ve 75953 sayılarında gösterildiği gibi Android'in farklı sürümlerinde ve çeşitli adressiz hatalarda farklı davranışlara sahiptir .
Bu nedenle, Html sınıfını, öğeler ve stil için daha fazla geri arama içeren Android sürümlerinde standartlaştırmak ve desteklemek için bir uyumluluk kitaplığı kullanmak isteyebilirsiniz:
Çerçevenin Html sınıfına benzer olsa da, daha fazla geri aramaya izin vermek için bazı imza değişiklikleri gerekiyordu. GitHub sayfasından örnek:
Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
// imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
Özel metin görünümü yazdığınızda, temel HTML seti metin özelliği bazı cihazlardan kaybolacaktır.
Bu yüzden aşağıdaki ek adımları yapmamız gerekir
public class CustomTextView extends TextView {
public CustomTextView(..) {
// other instructions
setText(Html.fromHtml(getText().toString()));
}
}
public class HtmlTextView extends AppCompatTextView {
public HtmlTextView(Context context) {
super(context);
init();
}
private void init(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setText(Html.fromHtml(getText().toString(), Html.FROM_HTML_MODE_COMPACT));
} else {
setText(Html.fromHtml(getText().toString()));
}
}
}
yukarıdaki cevap güncellemesi
Çözümü elde etmek için aşağıdaki kodu kullanın:
textView.setText(fromHtml("<Your Html Text>"))
Utitilty Yöntemi
public static Spanned fromHtml(String text)
{
Spanned result;
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
result = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY);
} else {
result = Html.fromHtml(text);
}
return result;
}
Biraz acayip ama yine de dahice bir çözüm önerebilir miyim! Bu makaleden fikri aldım ve Android için uyarladım. Temel olarak, kullanmak WebView
ve düzenlemek istediğiniz HTML'yi düzenlenebilir bir div etiketine ekler ve kullanırsınız . Bu şekilde kullanıcı WebView
klavyeye dokunduğunda görünür ve düzenlemeye izin verir. Onlar sadece düzenlenmiş HTML ve voila geri almak için bazı JavaScript ekleyin!
İşte kod:
public class HtmlTextEditor extends WebView {
class JsObject {
// This field always keeps the latest edited text
public String text;
@JavascriptInterface
public void textDidChange(String newText) {
text = newText.replace("\n", "");
}
}
private JsObject mJsObject;
public HtmlTextEditor(Context context, AttributeSet attrs) {
super(context, attrs);
getSettings().setJavaScriptEnabled(true);
mJsObject = new JsObject();
addJavascriptInterface(mJsObject, "injectedObject");
setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
loadUrl(
"javascript:(function() { " +
" var editor = document.getElementById(\"editor\");" +
" editor.addEventListener(\"input\", function() {" +
" injectedObject.textDidChange(editor.innerHTML);" +
" }, false)" +
"})()");
}
});
}
public void setText(String text) {
if (text == null) { text = ""; }
String editableHtmlTemplate = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta name=\"viewport\" content=\"initial-scale=1.0\" />" + "</head>" + "<body>" + "<div id=\"editor\" contenteditable=\"true\">___REPLACE___</div>" + "</body>" + "</html>";
String editableHtml = editableHtmlTemplate.replace("___REPLACE___", text);
loadData(editableHtml, "text/html; charset=utf-8", "UTF-8");
// Init the text field in case it's read without editing the text before
mJsObject.text = text;
}
public String getText() {
return mJsObject.text;
}
}
Ve işte bir Gist olarak bileşen.
Not: Orijinal çözümden yükseklik değişikliği geri aramasına ihtiyacım yoktu, bu yüzden burada eksik ama gerekirse kolayca ekleyebilirsiniz.
androidx.
Projenizde * sınıfları kullanıyorsanız , kullanmalısınız HtmlCompat.fromHtml(text, flag)
. Yöntemin kaynağı:
@NonNull
public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) {
if (Build.VERSION.SDK_INT >= 24) {
return Html.fromHtml(source, flags);
}
//noinspection deprecation
return Html.fromHtml(source);
}
Daha az kod, sadece bir satır ve onu kullanmanın önerilen yolu olduğundan Html.fromHtml'den daha iyi bir yoldur.
Bunun gibi basit Kotlin uzatma işlevini kullanabilirsiniz:
fun TextView.setHtmlText(source: String) {
this.text = HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_LEGACY)
}
Ve kullanım:
textViewMessage.setHtmlText("Message: <b>Hello World</b>")
Basitçe kullanın:
String variable="StackOverflow";
textView.setText(Html.fromHtml("<b>Hello : </b>"+ variable));