سؤال

لدي بسيطة لغة البرمجة:

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

أريد أن أعرض رسالة نصية HTML في TextView. كيف نفعل ذلك؟

هل كانت مفيدة؟

المحلول

تحتاج إلى استخدام Html.fromHtml() لاستخدام 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>

إنه يعمل فقط لعدد قليل من العلامات.

إذا كنت تريد أن تكون قادرًا على تكوينه من خلال XML دون أي تعديل في رمز Java ، فقد تجد هذه الفكرة مفيدة. ببساطة تتصل بـ 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);

إذا كنت تحاول إظهار 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 ولا تحتاج حقًا إلى ملف TextView, ، ثم خذ أ WebView واستخدامه مثل ما يلي:

String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);

هذا لا يقيدك على عدد قليل من علامات HTML أيضا.

أفضل طريقة لاستخدام أقسام CDATA للسلسلة في ملف STRINGS.XML للحصول على عرض فعلي لمحتوى 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 سليمة حتى بعد تنسيق النص باستخدام طريقة string.format. لذلك ، يعمل html.fromhtml (STR) بشكل جيد وسترى النص الجريء في رسالة الترحيب.

انتاج:

مرحبًا ، في متجر تطبيقات الموسيقى المفضل لديك. تسجيل الدخول كـ: اسم المستخدم

تجدر الإشارة إلى أن الطريقة html.fromhtml (مصدر السلسلة) تم إهماله اعتبارًا من مستوى API 24. إذا كان هذا هو واجهة برمجة التطبيقات المستهدفة ، فيجب عليك استخدامها html.fromhtml (مصدر السلسلة ، أعلام int) في حين أن.

أود أيضًا أن أقترح متابعة المشروع: https://github.com/nightwhistler/htmlspanner

الاستخدام هو نفسه تقريبًا مثل محول Android الافتراضي:

(new HtmlSpanner()).fromHtml()

تم العثور عليها بعد أن بدأت بالفعل من خلال تنفيذ HTML على محول spannable ، لأن HTML.Fromhtml القياسي لا يوفر مرونة كافية على تقديم التحكم وحتى عدم وجود إمكانية لاستخدام الخطوط المخصصة من TTF

استخدام بسيط Html.fromHtml("html string"). هذا سيفي بالغرض. إذا كانت السلسلة تحتوي على علامات مثل <h1> ثم ستأتي المساحات. لكن لا يمكننا القضاء على تلك المساحات. إذا كنت لا تزال ترغب في إزالة المسافات ، فيمكنك إزالة العلامات الموجودة في السلسلة ثم تمرير السلسلة إلى الطريقة Html.fromHtml("html string"); . بشكل عام أيضًا ، تأتي هذه الأوتار من الخادم (ديناميكي) ولكن ليس في كثير من الأحيان ، إذا كان من الأفضل أن تمرير السلسلة كما هو الحال في الطريقة بدلاً من محاولة إزالة العلامات من السلسلة.

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

لقد قمت بتطبيق هذا باستخدام عرض الويب. في حالتي ، يجب أن أقوم بتحميل الصورة من عنوان 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);

تم اقتراحه من خلال إجابات مختلفة لاستخدام لغة البرمجة فئة الإطار كما هو مقترح هنا ، ولكن لسوء الحظ ، فإن هذه الفئة لها سلوك مختلف في إصدارات مختلفة من Android وعلاب مختلفة غير معالجة ، كما هو موضح في القضايا 214637, 14778, 235128 و 75953.

لذلك قد ترغب في استخدام مكتبة التوافق لتوحيد وعملية الفئة HTML عبر إصدارات Android والتي تتضمن المزيد من عمليات الاسترجاعات للعناصر والتصميم:

GitHub Project HTMLcompat

على الرغم من أنه يشبه فئة HTML الخاصة بـ Framework ، إلا أن بعض التغييرات المميزة كانت مطلوبة للسماح بمزيد من عمليات الاسترجاعات. إليك العينة من صفحة 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() طريقة. أقترح عليك استخدام 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);

بهذه الطريقة يمكنك تجنب فحص إصدار API Android وهو سهل الاستخدام (حل سطر واحد).

كلما كتبت نصوص نص مخصصة ، سيتم الحصول على ميزة نصية HTML Set Set Basy من بعض الأجهزة.

لذلك نحن بحاجة إلى القيام باتباع الخطوات الإضافية هو العمل

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

تحديث الإجابة أعلاه

هل لي أن أقترح حلًا مخترقًا إلى حد ما ولكن لا يزال عبقريًا! حصلت على الفكرة من هذه المقالة وتكييفه لنظام Android. في الأساس تستخدم أ WebView وأدخل HTML الذي تريد عرضه وتحريره في علامة DIV قابلة للتحرير. بهذه الطريقة عندما يقوم المستخدم بنقرل WebView تظهر لوحة المفاتيح وتسمح بالتحرير. أنت فقط تضيف بعض JavaScript لاستعادة 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;
    }
}

و هنا هو المكون كجوهر.

ملاحظة: لم أكن بحاجة إلى تغيير رد الاتصال من الحل الأصلي بحيث يكون مفقودًا هنا ولكن يمكنك إضافته بسهولة إذا لزم الأمر.

إذا كنت تستخدم 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 حيث يوجد رمز أقل ، وسطر واحد فقط ، وطريقة موصى بها لاستخدامها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top