span - android textview html tags




TextView에 HTML을 표시하는 방법? (12)

나는 간단한 HTML을 가지고있다 :

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

TextView HTML 스타일의 텍스트를 표시하고 싶습니다. 이 작업을 수행하는 방법?



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

html 텍스트를 표시하고 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) 잘 작동하고 환영 메시지에서 굵은 텍스트를 볼 수 있습니다.

산출:

좋아하는 음악 앱 스토어에 오신 것을 환영합니다. 사용자 이름 : username


다소 해킹되었지만 여전히 천재적인 해결책을 제안 할 수 있습니다. 이 기사 에서 아이디어를 얻었고 Android 용으로 채택했습니다. 기본적으로 WebView 를 사용하고 편집 가능한 div 태그에서 표시하고 편집하려는 HTML을 삽입합니다. 이 방법으로 사용자가 WebView 탭하면 키보드가 나타나고 편집 할 수 있습니다. 자바 스크립트를 추가하면 편집 된 HTML을 다시 볼 수 있습니다.

다음은 코드입니다.

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

그리고 here 에 요지로서의 구성 요소가 있습니다.

참고 : 원래 솔루션의 높이 변경 콜백이 필요 없으므로 여기에서 누락되었지만 필요할 경우 쉽게 추가 할 수 있습니다.


다음과 같은 전역 메소드를 작성하십시오.

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

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

자세한 내용은이 post 을 참조하십시오.


사용자 정의 텍스트보기를 작성할 때마다 기본 HTML 세트 텍스트 기능이 일부 장치의 양식을 사라지게됩니다.

그래서 우리는 addtional steps을 따라 할 필요가있다 make make work

공용 클래스 CustomTextView는 TextView {

// 내부 생성자

   setText(Html.fromHtml(getText().toString()));

}


웹보기를 사용하여 구현했습니다. 제 경우에는 텍스트보기의 텍스트와 함께 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);

이것에보십시오 : https://.com/a/8558249/450148

그것은 꽤 좋다!!

<resource>
    <string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>

태그가 거의없는 경우에만 작동합니다.


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

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






android-textview