간단한 HTML이 있습니다 .
<h2>Title</h2><br>
<p>description here</p>
에 HTML 스타일의 텍스트를 표시하고 싶습니다 TextView
. 이것을하는 방법?
간단한 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>"));
}
h2
정의상 그 자체로 많은 마진이 생깁니다. 그리고 p
일부 여유와 함께 제공됩니다. 차이를 원하지 않으면 다른 html 요소를 사용하는 것이 좋습니다.
android.text.Html.fromHtml
. 나는 대부분의 IDE가 당신을 위해 그것을 고칠 것이라는 것을 알고 있지만 가독성을 위해 패키지 이름을 아는 것이 좋습니다.
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 : //.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"/>
문자열 리소스 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));
자세한 내용은이 게시물 을 참조 하십시오.
아래 코드는 나에게 가장 좋은 결과를 주었다.
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());
html 텍스트를 표시하고 정말로 필요하지 않은 경우 TextView
a WebView
를 사용하여 다음과 같이 사용하십시오.
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
html 태그로 제한하지는 않습니다.
layout_height="wrap_content"
. 대신 명시적인 높이 또는 match_parent를 설정해야합니다.
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)이 제대로 작동하면 시작 메시지에 굵은 글씨가 표시됩니다.
산출:
좋아하는 음악 앱 스토어에 오신 것을 환영합니다. 다음으로 로그인 : username
Html.fromHtml (String source) 메소드 는 API 레벨 24부터 더 이상 사용되지 않습니다. 대상 API 인 경우 Html.fromHtml (String source, int flags) 을 사용해야합니다. 대신 합니다.
다음 프로젝트를 제안하고 싶습니다 : https://github.com/NightWhistler/HtmlSpanner
사용법은 기본 안드로이드 변환기와 거의 동일합니다.
(new HtmlSpanner()).fromHtml()
표준 Html.fromHtml은 렌더링 제어에 대한 충분한 유연성을 제공하지 않으며 심지어 ttf의 사용자 정의 글꼴을 사용할 가능성도 없기 때문에 이미 html에서 확장 가능한 변환기로 자체 구현을 시작한 후에 그것을 발견했습니다.
나는이 질문이 오래되었다는 것을 안다. Html.fromHtml()
방법을 제안 하는 다른 답변 . 난 당신이 사용하는 것이 좋습니다 HtmlCompat.fromHtml()
에서 androidx.core.text.HtmlCompat
패키지로 제공된다. 이것은 이전 버전과 호환되는 버전이므로Html
클래스입니다.
샘플 코드 :
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);
이러한 방식으로 Android API 버전 확인을 피할 수 있으며 사용하기 쉽습니다 (단일 솔루션).
다음과 같은 전역 방법을 만드십시오.
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;
}
다음과 같이 액티비티 / 프레임에서 사용할 수도 있습니다.
text_view.setText(stripHtml(htmlText));
웹보기를 사용하여 이것을 구현했습니다. 제 경우에는 텍스트보기의 텍스트와 함께 URL에서 이미지를로드해야하며 이것은 저에게 효과적입니다.
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 프레임 워크 클래스 를 사용하는 다양한 답변을 통해 제안되었지만 불행히도이 클래스는 문제 214637 , 14778 , 235128 에서 설명한 바와 같이 다양한 Android 버전 및 다양한 주소 지정되지 않은 버그에서 다르게 작동합니다. 및 75953 다릅니다 .
따라서 호환성 라이브러리를 사용하여 요소 및 스타일에 대한 더 많은 콜백을 포함하는 Android 버전에서 Html 클래스를 표준화하고 백 포트 할 수 있습니다.
프레임 워크의 Html 클래스와 유사하지만 더 많은 콜백을 허용하기 위해 일부 서명 변경이 필요했습니다. GitHub 페이지의 샘플은 다음과 같습니다.
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);
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()));
}
}
}
솔루션을 얻으려면 아래 코드를 사용하십시오.
textView.setText(fromHtml("<Your Html Text>"))
자폐증 방법
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;
}
다소 해 키지 만 여전히 천재적인 해결책을 제안 할 수 있습니다! 이 기사 에서 아이디어를 얻어 Android에 맞게 조정했습니다. 기본적으로 a를 사용 WebView
하고 편집 가능한 div 태그에 표시하고 편집하려는 HTML을 삽입하십시오. 이렇게하면 사용자가WebView
가 키보드를 누르면 키보드가 나타나고 편집 할 수 있습니다. 편집 한 HTML과 짜잔을 다시 얻기 위해 JavaScript를 추가하면됩니다!
코드는 다음과 같습니다.
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;
}
}
그리고 여기 요점으로서의 구성 요소가 있습니다.
참고 : 원래 솔루션에서 높이 변경 콜백이 필요하지 않으므로 여기에 누락되어 있지만 필요한 경우 쉽게 추가 할 수 있습니다.
androidx.
프로젝트에서 * 클래스 를 사용하는 경우을 사용해야합니다 HtmlCompat.fromHtml(text, flag)
. 방법의 출처는 다음과 같습니다.
@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);
}
코드가 적고 한 줄만 사용하고 권장되는 방법이 있으므로 Html.fromHtml보다 낫습니다.
다음과 같이 간단한 Kotlin 확장 기능을 사용할 수 있습니다.
fun TextView.setHtmlText(source: String) {
this.text = HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_LEGACY)
}
그리고 사용법 :
textViewMessage.setHtmlText("Message: <b>Hello World</b>")