sourcetip

TextView에서 HTML을 표시하는 방법

fileupload 2023. 4. 8. 09:09
반응형

TextView에서 HTML을 표시하는 방법

심플한 HTML:

<h2>Title</h2><br>
<p>description here</p>

를 HTML로 .TextView떻게게 하???

XML 문자열에서 HTML을 사용하려면 를 사용해야 합니다.레이아웃 XML에서 HTML과 함께 문자열을 참조하는 것만으로는 작동하지 않습니다.

Java에서 해야 할 일은 다음과 같습니다.

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

코틀린에서는

textView.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT)
} else {
    Html.fromHtml(html)
}

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"/>

문자열 리소스 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));

상세한 것에 대하여는, 투고를 참조해 주세요.

이 질문이 오래됐다는 거 알아요.다른 답변은 방법을 제안합니다.에서 사용하는 것을 추천합니다.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의 버전 체크를 회피할 수 있어 사용하기 편리합니다(단일 라인 솔루션).

아래 코드가 나에게 가장 좋은 결과를 주었다.

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

없는 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 섹션은 문자열을 사용하여 텍스트를 포맷한 후에도 html 태그 데이터를 그대로 유지합니다.포맷 방식따라서 Html.fromHtml(str)은 정상적으로 동작하며 Welcome 메시지에 굵은 글씨가 표시됩니다.

출력:

즐겨찾는 음악 앱스토어에 오신 것을 환영합니다.로그인 이름: 사용자 이름

API 레벨 24에서는 Html.fromHtml(String source) 메서드는 권장되지 않습니다.대상 API일 경우 대신 Html.fromHtml(String source, int flags)을 사용해야 합니다.

문자열에서 html을 변환하기 위해 Kotlin 확장자를 만들었습니다.

fun String?.toHtml(): Spanned? {
    if (this.isNullOrEmpty()) return null
    return HtmlCompat.fromHtml(this, HtmlCompat.FROM_HTML_MODE_COMPACT)
}

다음 프로젝트도 제안하고 싶습니다.https://github.com/NightWhistler/HtmlSpanner

사용 방법은 기본 Android 컨버터와 거의 동일합니다.

(new HtmlSpanner()).fromHtml()

이미 html에서 spannable 변환기로의 실장 후 찾았습니다.표준 Html은 렌더링 제어에 충분한 유연성을 제공하지 않으며 ttf에서 커스텀 폰트를 사용할 수도 없기 때문입니다.

Html 프레임워크 클래스를 사용하는 것은 여기서 제시된 바와 같이 다양한 답변을 통해 제안되었지만 안타깝게도 이 클래스는 Android 버전 및 다양한 주소 미지정 버그에서 동작이 다릅니다.이 버그는 214637, 14778, 23512875953에서 설명되었습니다.

따라서 호환성 라이브러리를 사용하여 요소 및 스타일링에 대한 더 많은 콜백을 포함하는 Android 버전 간에 HTML 클래스를 표준화하고 백포트할 수 있습니다.

Github 프로젝트 Html Compat

프레임워크의 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);

사용법 ★★★★★★★★★★★★★*Html.fromHtml("html string")에 '하다'와 같은 태그가 경우<h1>우주가 올 것이다.하지만 우리는 그 공간을 없앨 수 없습니다.는, , 「」, 「」, 「」, 「」, 「」, 「」의 메서드에 문자열을 .Html.fromHtml("html string");, 다이나믹으로부터 태그를 하는 것보다, 는 별로

「 」를 사용하고 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);
    }

HtmlCompat.fromHtmlHtml.fromHtml코드 수가 적기 때문에 코드 한 줄만 사용할 수 있으며 권장되는 방법은 권장됩니다.

간단히 사용하다 여기에 이미지 설명 입력

checkBoxTextView.text =
        Html.fromHtml("<p><font color=#666666>I agree to</font><font color=#0173B7>  <b><u>Terms & Conditions</u></b></font><font color=#666666> and the <u></font><b><font color=#0173B7>Privacy Policy</font></u></b></font></p>")

웹 뷰를 사용하여 구현했습니다.저 같은 경우에는 텍스트 뷰에 있는 텍스트와 함께 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);
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)

다음과 같은 글로벌 메서드를 만듭니다.

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

커스텀 텍스트뷰를 쓸 때마다 기본적인 HTML 설정 텍스트 기능이 일부 디바이스에서 사라집니다.

그래서 우리는 추가 단계를 따라야 한다.

public class CustomTextView extends TextView {

    public CustomTextView(..) {
        // other instructions
        setText(Html.fromHtml(getText().toString()));
    }
}

사용방법:

String variable="StackOverflow";
textView.setText(Html.fromHtml("<b>Hello : </b>"+ variable));

사람들은 TextView, WebView 및 모든 종류의 솔루션에 대해 서브클래스를 제안하고 있습니다. 아무도 간단한 바인딩 어댑터를 언급하지 않았는지 궁금합니다.

@BindingAdapter(value = ["htmlText"])
fun TextView.setHtmlText(string: String?) {
    text = HtmlCompat.fromHtml(string?:"", HtmlCompat.FROM_HTML_MODE_COMPACT)
}

따라서 TextView xml은 다음과 같이 표시됩니다.

<TextView
   ...
   htmlText="<p>Your <b>HTML</b> text</p>"
   ... />
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>"))

Utitilty 메서드

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

다음과 같이 간단한 Kotlin 확장 기능을 사용할 수 있습니다.

fun TextView.setHtmlText(source: String) {
    this.text = HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_LEGACY)
}

용도:

textViewMessage.setHtmlText("Message: <b>Hello World</b>")

다소 노련하지만 여전히 천재적인 해결책을 제안해 드리겠습니다! 기사에서 아이디어를 얻어 안드로이드용으로 각색했습니다.기본적으로는WebView편집 가능한 div 태그에 표시 및 편집할 HTML을 삽입합니다.이 방법으로 사용자가 를 탭할 때WebView키보드가 표시되어 편집할 수 있습니다.편집된 HTML과 voila를 되찾기 위해 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;
    }
}

그리고 여기 Gist의 컴포넌트가 있습니다.

주의: 원래 솔루션에서 높이 변경 콜백이 필요하지 않았기 때문에 여기에는 없습니다만, 필요에 따라서 간단하게 추가할 수 있습니다.

BindingAdapter 사용:

@BindingAdapter("renderHtml")
fun bindRenderHtml(view: TextView, description: String?) {
if (description != null) {
    view.text = HtmlCompat.fromHtml(description, FROM_HTML_MODE_COMPACT)
    view.movementMethod = LinkMovementMethod.getInstance()
} else {
    view.text = ""
}

}

사용방법:

  <TextView
        android:id="@+id/content_text_view"
        app:renderHtml="@{show.description}"
        ...

Android용 유효한 HTML을 구축할 수 있습니다.TextViewGithub 라이브러리 사용 : https://github.com/jaredrummler/HtmlDsl

라이브러리는 Android에 의해 렌더링되는 요소 및 속성만 지원함으로써 코드를 보다 이해하기 쉽고 오류 발생률을 낮출 수 있도록 구문설탕을 제공합니다.

HTML 작성 예:

textView.setHtml {
    h3("Android Versions:")
    ul {
        li {
            a(href = "https://developer.android.com/about/versions/12/get") {
                +"Android 12 Beta"
            }
        }
        li("Android 11")
        li("Android 10")
        li("Pie")
        li("Oreo")
        li("Nougat")
        li("Marshmallow")
        li("Lollipop")
        // ...
    }

    small {
        sub {
            +"by "
            a {
                href = "https://github.com/jaredrummler"
                text = "Jared Rummler"
            }
        }
    }
}

Android에서 지원되는 HTML 요소TextView:

<a href="...">
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div align="...">
<em>
<font color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i>
<img src="...">
<p>
<small>
<strike>
<strong>
<sub>
<sup>
<tt>
<u>
<ul>
<li>

언급URL : https://stackoverflow.com/questions/2116162/how-to-display-html-in-textview

반응형