TextView에서 HTML을 표시하는 방법은 무엇입니까?
간단한 HTML이 있습니다 .
<h2>Title</h2><br>
<p>description here</p>
HTML 스타일 텍스트를 TextView
. 어떻게하나요?
Html.fromHtml()
XML 문자열에서 HTML 을 사용하려면 을 사용해야합니다. 레이아웃 XML에서 HTML로 문자열을 참조하는 것만으로는 작동하지 않습니다.
이것은 당신이해야 할 일입니다 :
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>"));
}
setText (Html.fromHtml (bodyData)) 는 api 24 이후 더 이상 사용되지 않습니다 . 이제 다음을 수행해야합니다.
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));
}
이것 좀 봐 : https://stackoverflow.com/a/8558249/450148
너무 좋아요 !!
<resource>
<string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>
몇 가지 태그에 대해서만 작동합니다.
Java 코드를 수정하지 않고 xml을 통해 구성 할 수 있도록하려면이 아이디어가 도움이 될 수 있습니다. 생성자에서 init를 호출하고 텍스트를 html로 설정하기 만하면됩니다.
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"/>
아래 코드는 나에게 최상의 결과를 제공했습니다.
TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
문자열 리소스 ID에서 HTML을 표시하려는 경우 형식이 화면에 표시되지 않을 수 있습니다. 이런 일이 발생하면 대신 CDATA 태그를 사용해보십시오.
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));
자세한 내용은이 게시물 을 참조 하십시오.
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());
일부 html 텍스트를 표시하고 싶지만 실제로는 필요하지 않은 경우 a TextView
를 가져와 WebView
다음과 같이 사용하십시오.
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
이것은 몇 개의 html 태그로 제한되지 않습니다.
strings.xml 파일의 문자열에 CData 섹션을 사용하여 html 콘텐츠를 TextView에 실제로 표시하는 가장 좋은 방법은 아래 코드 스 니펫이 공정한 아이디어를 제공합니다.
//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));
문자열 텍스트의 CData 섹션은 String.format 메서드를 사용하여 텍스트 서식을 지정한 후에도 html 태그 데이터를 그대로 유지합니다. 따라서 Html.fromHtml (str)이 제대로 작동하고 환영 메시지에 굵은 텍스트가 표시됩니다.
산출:
Welcome, to your favorite music app store. Logged in as: username
It's worth mentioning that the method Html.fromHtml(String source) is deprecated as of API level 24. If that's your target API, you should use Html.fromHtml(String source, int flags) instead.
I would like also to suggest following project: https://github.com/NightWhistler/HtmlSpanner
Usage is almost the same as default android converter:
(new HtmlSpanner()).fromHtml()
Found it after I already started by own implementation of html to spannable converter, because standard Html.fromHtml does not provide enough flexibility over rendering control and even no possibility to use custom fonts from ttf
Simple use Html.fromHtml("html string")
. This will work. If the string has tags like <h1>
then spaces will come. But we cannot eliminate those spaces. If you still want to remove the spaces, then you can remove the tags in the string and then pass the string to the method Html.fromHtml("html string");
. Also generally these strings come from server(dynamic) but not often, if it is the case better to pass the string as it is to the method than try to remove the tags from the string.
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
Make a global method like:
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;
}
You can also use it in your Activity/Fragment like:
text_view.setText(stripHtml(htmlText));
I have implemented this using web view. In my case i have to load image from URL along with the text in text view and this works for me.
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);
It has been suggested through various answers to use the Html framework class as suggested here, but unfortunately this class has different behavior in different versions of Android and various unaddressed bugs, as demonstrated in issues 214637, 14778, 235128 and 75953.
You may therefore want to use a compatibility library to standardize and backport the Html class across Android versions which includes more callbacks for elements and styling:
While it is similar to the framework's Html class, some signature changes were required to allow more callbacks. Here's the sample from the GitHub page:
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);
I know this question is old. Other answers here suggesting Html.fromHtml()
method. I suggest you to use HtmlCompat.fromHtml()
from androidx.core.text.HtmlCompat
package. As this is backward compatible version of Html
class.
Sample code:
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);
By this way you can avoid Android API version check and it's easy to use (single line solution).
Whenever you write custom text view basic HTML set text feature will be get vanished form some of the devices.
So we need to do following addtional steps make is work
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()));
}
}
}
update of answer above
May I suggest a somewhat hacky but still genius solution! I got the idea from this article and adapted it for Android. Basically you use a WebView
and insert the HTML you want to show and edit in an editable div tag. This way when the user taps the WebView
the keyboard appears and allows editing. They you just add some JavaScript to get back the edited HTML and voila!
Here is the code:
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;
}
}
And here is the component as a Gist.
Note: I didn't need the height change callback from the original solution so that's missing here but you can easily add it if needed.
If you use androidx.
* classes in your project, you should use HtmlCompat.fromHtml(text, flag)
. Source of the method is:
@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); }
It is better way than Html.fromHtml as there is less code, only one line, and recommended way to use it.
참고URL : https://stackoverflow.com/questions/2116162/how-to-display-html-in-textview
'Programing' 카테고리의 다른 글
Android에서 한 활동에서 다른 활동으로 객체를 전달하는 방법 (0) | 2020.09.30 |
---|---|
다중 처리 vs 스레딩 Python (0) | 2020.09.30 |
특정 입력에서 IE10의 "필드 지우기"X 버튼을 제거 하시겠습니까? (0) | 2020.09.30 |
mongo 셸의 모든 컬렉션을 나열하는 방법은 무엇입니까? (0) | 2020.09.30 |
C #의 동기 메서드에서 비동기 메서드를 호출하는 방법은 무엇입니까? (0) | 2020.09.30 |