Html List tag android textview में काम नहीं कर रहा है। मैं क्या कर सकता हूँ?


99

Html List टैग Android TextView में काम नहीं कर रहा है। यह मेरी स्ट्रिंग सामग्री है:

String str="A dressy take on classic gingham in a soft, textured weave of stripes that resembles twill.  Take a closer look at this one.<ul><li>Trim, tailored fit for a bespoke feel</li><li>Medium spread collar, one-button mitered barrel cuffs</li><li>Applied placket with genuine mother-of-pearl buttons</li><li>;Split back yoke, rear side pleats</li><li>Made in the U.S.A. of 100% imported cotton.</li></ul>";

मैंने इसे इस तरह से टेक्स्ट व्यू में लोड किया है:

textview.setText(Html.fromHtml(str));

आउटपुट एक पैराग्राफ की तरह दिखता है। मैं क्या कर सकता हूँ? क्या इसका कोई हल है?

संपादित करें:

webview.loadData(str,"text/html","utf-8");

1
टेक्स्ट / html होना चाहिए टेक्सल / html नहीं।
च्लोए

जवाबों:


156

जैसा कि आप Htmlवर्ग स्रोत कोड में देख सकते हैं , Html.fromHtml(String)सभी HTML टैग का समर्थन नहीं करता है। इस मामले में, <ul>और <li>समर्थित नहीं हैं।

स्रोत कोड से मैंने अनुमत HTML टैग की एक सूची बनाई है:

  • br
  • p
  • div
  • em
  • b
  • strong
  • cite
  • dfn
  • i
  • big
  • small
  • font
  • blockquote
  • tt
  • monospace
  • a
  • u
  • sup
  • sub

तो आप बेहतर उपयोग करें WebViewऔर इसकी loadDataWithBaseURLविधि। कुछ इस तरह की कोशिश करो:

String str="<html><body>A dressy take on classic gingham in a soft, textured weave of stripes that resembles twill.  Take a closer look at this one.<ul><li>Trim, tailored fit for a bespoke feel</li><li>Medium spread collar, one-button mitered barrel cuffs</li><li>Applied placket with genuine mother-of-pearl buttons</li><li>;Split back yoke, rear side pleats</li><li>Made in the U.S.A. of 100% imported cotton.</li></ul></body></html>";
webView.loadDataWithBaseURL(null, str, "text/html", "utf-8", null);

फिर मैं इसे सुधारने के लिए क्या कर सकता हूं?
प्रवीण

2
इस "अनुमत" टैग के कुछ गुणों को नोट करने के लिए बहुत महत्वपूर्ण है समर्थित नहीं हैं। : = (
जोर्जेस

2
शांत हो जाओ ... मैंने अपना जवाब संपादित किया, कृपया मुझे बताएं कि क्या यह काम करता है।
क्रिस्टियन

6
आप वास्तव में इसे उसी तरह से एक WebView का उपयोग नहीं कर सकते हैं, इसलिए यह वास्तव में एक समाधान योग eh समस्या नहीं है।
ब्रिल पप्पिन

11
यह कैसे एक समाधान है? आप सिर्फ एक WebView का उपयोग नहीं कर सकते हैं यह एक TextView की तुलना में बहुत महंगा विजेट है। आपके पास प्रत्येक स्वरूपित पाठ के लिए आप बस एक WebView का उपयोग नहीं कर सकते।
SpaceMonkey

135

मुझे वही समस्या हो रही है, जो मैंने किया वह डिफ़ॉल्ट टैगहैंडलर को ओवरराइड कर रहा है । यह एक मेरे लिए काम किया।

public class MyTagHandler implements TagHandler {

    boolean first = true;
    String parent = null;
    int index = 1;
    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {

        if (tag.equals("ul")) {
            parent = "ul";
        } else if (tag.equals("ol")) {
            parent = "ol";
        }

        if (tag.equals("li")) {
            if (parent.equals("ul")) {
                if (first) {
                    output.append("\n\t•");
                    first = false;
                } else {
                    first = true;
                }
            } else{
                if (first) {
                    output.append("\n\t"+index+". ");
                    first = false;
                    index++;
                } else {
                    first = true;
                }
            }   
        }
    }
}

और पाठ प्रदर्शित करने के लिए ...

myTextView.setText(Html.fromHtml("<ul><li>I am an Android developer</li><li>Another Item</li></ul>", null, new MyTagHandler()));

[संपादित करें]

कुित्सि ने एक बहुत अच्छी लाइब्रेरी भी पोस्ट की है जो ऐसा ही करती है, इसे इस एसओ लिंक से मिला है ।


हमने अंत में इस दृष्टिकोण का उपयोग किया। कोई भी असमर्थित HTML टैग, हम स्वयं पाठ में कोड करते हैं। अभी के लिए यह सिर्फ ol और ul है, लेकिन हमने सूची में घोंसले को संभालने के लिए ढेर में जोड़ा और जब ol से घोंसले का संचय किया जाता है। इसके अलावा आप पहले के प्रतिस्थापन में शुरुआती बूलियन पैरामीटर का उपयोग कर सकते हैं।
जॉनवेलिस

6
@Aman गौतम इसके लिए बहुत बढ़िया धन्यवाद! क्या आपके पास कोई विचार है कि पाठ को कैसे टैब करना है जब वह 1 से अधिक लाइन लपेटता है? दूसरी पंक्ति के बाद इस कोड के साथ पाठ को संख्या को अलग रखने के लिए सारणीबद्ध करने के बजाय संख्या के साथ संरेखित किया जाता है। मैंने कुछ चीजों का प्रयास किया, लेकिन मैं इसका पता नहीं लगा सका
रयानजी

यहाँ एक ही बात, एक सूची में लाइनब्रेक इस दृष्टिकोण के साथ ट्रोब्यूल का कारण बनता है।
एंड्रियास रुडोल्फ

चिपकाया बुलेट चरित्र का उपयोग करने के बजाय, यूनिकोड वर्ण का उपयोग करना बेहतर हो सकता है: output.append ("\ n \ t \ u2022");
मैट मैकिन

इस अच्छे कोड के लिए धन्यवाद, लेकिन मैं इसका इस्तेमाल तब तक नहीं कर सकता जब तक हम एक समाधान नहीं
निकालेंगे

68

पूर्ण नमूना परियोजना https://bitbucket.org/Kuitsi/android-textview-html-list पर स्थित है ।
नमूना चित्र https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png पर उपलब्ध है

यह समाधान माशा के जवाब के सबसे करीब है । कुछ कोड आंतरिक वर्ग से भी लिए गए हैं android.text.Html.HtmlToSpannedConverter। यह नेस्टेड ऑर्डर और अनऑर्डर की गई सूचियों का समर्थन करता है, लेकिन ऑर्डर किए गए सूचियों में बहुत लंबे टेक्स्ट अभी भी टेक्स्ट के बजाय आइटम नंबर के साथ संरेखित हैं। मिश्रित सूचियों (ol और ul) को कुछ काम भी चाहिए। नमूना परियोजना में Html.TagHandler का कार्यान्वयन होता है जिसे Html.fromHtml (String, ImageGetter, TagHandler) से पारित किया जाता है

संपादित करें: व्यापक HTML टैग समर्थन के लिए, https://github.com/NightWhistler/HtmlSpanner भी कोशिश करने लायक हो सकता है।


अब तक का सबसे अच्छा उपाय। धन्यवाद
peter.bartos

BitBucket रेपो में कोई मुद्दा ट्रैकिंग, यहाँ पोस्टिंग तो: आपको चेक जोड़ने की जरूरत है यहाँ और यहाँ के लिए output.length() > 0के रूप मेंif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
mindeh

2
इस पर 2 घंटे बर्बाद करने वाले अन्य लोगों से बचने के लिए, नाइटहिस्टलर एचटीएमएलस्पैनर अपने अज्ञात कारण के लिए सभी उच्चारण पात्रों को हटा देता है।
इपिकपांडेफर्स

@ किस्सी समाधान के लिए धन्यवाद। इसके साथ एक मुद्दा है, जब html पाठ "<ul> <li> कुछ </ li> </ ul>" है, तो "कुछ" में अंतिम अक्षर सूची में प्रदर्शित नहीं होता है।
सैम बर्ग

यह एक बहुत अच्छा समाधान है, लेकिन दो कमियां: 1) यह एंड्रॉइड very 7 और 2 का समर्थन नहीं करता है ) यह सूची के पहले स्तर के लिए इंडेंट शुरू नहीं करता है।
सोशियल

24

अमन गुआतम कोड के लिए एक छोटा सा फिक्स। ऊपर दिए गए फ़ंक्शन में न्यूलाइन वर्ण प्रदान करने की समस्या है। उदाहरण के लिए: यदि <li>टैग से पहले टैग होता है <p>, तो 2 नईलाइन वर्ण प्रदान किए जाते हैं। यहाँ उन्नत कोड है:

import org.xml.sax.XMLReader;

import android.text.Editable;
import android.text.Html.TagHandler;

public class ListTagHandler implements TagHandler {
    boolean first = true;

    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {

        // TODO Auto-generated method stub
        if (tag.equals("li")) {
            char lastChar = 0;
            if (output.length() > 0)
                lastChar = output.charAt(output.length() - 1);
            if (first) {
                if (lastChar == '\n')
                    output.append("\t•  ");
                else
                    output.append("\n\t•  ");
                first = false;
            } else {
                first = true;
            }
        }
    }
}

सरल अभी तक प्रभावी
स्टीवन 055

ऑर्डर की गई सूची के बारे में क्या?
एंड्रॉयड डेवलपर

13

चेतावनी

फरवरी १०, २०१६ को android.text.Htmlवास्तव में समर्थन करता है liऔर ulटैग करता है और एक मूल का उपयोग करता है new BulletSpan(), जिसका अर्थ है एंड्रॉइड के नवीनतम संस्करणों में Html.TagHandlerयहां पोस्ट किए गए समाधानों को अनदेखा किया जाएगा।

सुनिश्चित करें कि आपका कोड इस परिवर्तन को संभालता है यदि आप डिफ़ॉल्ट से एक बड़े अंतर के साथ बुलेटस्पैन की उम्मीद कर रहे हैं, तो आपको कुछ प्रकार का समाधान करना होगा जो स्पैन का पता / प्रतिस्थापन करता है।


4
लेकिन वह नया Html वर्ग केवल Android Nऔर इसके बाद के संस्करण में उपलब्ध है ।
साकिबॉय

1
हां - तो आपको इस तथ्य पर ध्यान देने की आवश्यकता है कि विभिन्न ओएस संस्करण अलग-अलग व्यवहार करेंगे। इसलिए मैं एक ऐसे समाधान की सलाह देता हूं जो HTML को अलग-अलग स्पैन में पार्स करने के बाद बुलेटस्पैन को ढूंढता है और बदल देता है। N के बाद के संस्करणों का डिफ़ॉल्ट कार्यान्वयन एक डिफ़ॉल्ट मार्जिन का उपयोग करेगा, आप इन्हें अपने इच्छित मार्जिन से ढूंढ और बदल सकते हैं।
कासिम

हमेशा अप टू डेट रहते हैं।
काई वांग

9

अग्रणी समाधान का उपयोग कर अग्रणी। हैंडल्स ने ऑर्डर किया और अनएडिटेड लिस्ट के साथ-साथ नेस्टिंग भी।

public class ListTagHandler implements TagHandler
{
    private int                 m_index     = 0;
    private List< String >  m_parents   = new ArrayList< String >( );

    @Override
    public void handleTag( final boolean opening, final String tag, Editable output,    final XMLReader xmlReader )
    {
        if( tag.equals( "ul" ) || tag.equals( "ol" ) || tag.equals( "dd" ) )
        {
            if( opening )
            {
                m_parents.add( tag );
            }
            else m_parents.remove( tag );

            m_index = 0;
        }
        else if( tag.equals( "li" ) && !opening ) handleListTag( output );
    }

    private void handleListTag( Editable output )
    {
        if( m_parents.get(m_parents.size()-1 ).equals( "ul" ) )
        {
            output.append( "\n" );
            String[ ] split = output.toString( ).split( "\n" );

            int lastIndex = split.length - 1;
            int start = output.length( ) - split[ lastIndex ].length( ) - 1;
            output.setSpan( new BulletSpan( 15 * m_parents.size( ) ), start, output.length( ), 0 );
        }
        else if( m_parents.get(m_parents.size()-1).equals( "ol" ) )
        {
            m_index++ ;

            output.append( "\n" );
            String[ ] split = output.toString( ).split( "\n" );

            int lastIndex = split.length - 1;
            int start = output.length( ) - split[ lastIndex ].length( ) - 1;
            output.insert( start, m_index + ". " );
            output.setSpan( new LeadingMarginSpan.Standard( 15 * m_parents.size( ) ), start, output.length( ), 0 );
        }
    }
}

5
मुझे स्पैन का उपयोग करने का विचार पसंद है लेकिन मुझे इस कोड के साथ काम करने वाली नेस्टेड सूची नहीं मिल सकती है। दोनों लाइनें output.setSpan(...)java.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
कुित्सि

अच्छा समाधान के लिए धन्यवाद! यह कई लाइन ग्रंथों को भी प्रस्तुत करता है
पीटर। जर्ट

2
आप एक साधारण ArrayList के बजाय वेक्टर का उपयोग क्यों करते हैं? एक वेक्टर मल्टी थ्रेड्स के लिए है ...
एंड्रॉइड डेवलपर

@androiddeveloper c ++ प्रोग्रामर, मेरा बुरा, जवाब संपादित करने के लिए स्वतंत्र महसूस हो रहा है
masha

1
मैंने स्निपेट androidsnippets.com/- के
प्रतीक बुटानी

8

यदि आपको केवल एक सूची प्रारूपित करने की आवश्यकता है, तो इसे सरल रखें और उसी परिणाम को प्राप्त करने के लिए अपने TextView में एक यूनिकोड वर्ण को कॉपी / पेस्ट करें।

• यूनिकोड चरित्र 'BULLET' (U + 2022)


6

मैं यहां टैगहैंडलर कार्यान्वयन की तलाश में आया था। Truong Nguyen और Aman Guatam दोनों उत्तर बहुत अच्छे हैं, लेकिन मुझे दोनों के मिले-जुले संस्करण की आवश्यकता थी: मुझे अपने समाधान की आवश्यकता थी ताकि मैं इसे ओवरफॉर्म न कर सकूं और <ol>टैग्स को पुनः प्राप्त करने में सक्षम हो जाऊं , क्योंकि मैं कुछ पसंद कर रहा हूं <h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>

यहाँ मेरा समाधान है।

import org.xml.sax.XMLReader;

import android.text.Editable;
import android.text.Html.TagHandler;

public class MyTagHandler implements TagHandler {
    boolean first = true;
    String parent = null;
    int index = 1;

    public void handleTag(final boolean opening, final String tag,
            final Editable output, final XMLReader xmlReader) {

        if (tag.equals("ul")) {
            parent = "ul";
                    index = 1;
        } else if (tag.equals("ol")) {
            parent = "ol";
                    index = 1;
        }
        if (tag.equals("li")) {
            char lastChar = 0;
            if (output.length() > 0) {
                lastChar = output.charAt(output.length() - 1);
            }
            if (parent.equals("ul")) {
                if (first) {
                    if (lastChar == '\n') {
                        output.append("\t•  ");
                    } else {
                        output.append("\n\t•  ");
                    }
                    first = false;
                } else {
                    first = true;
                }
            } else {
                if (first) {
                    if (lastChar == '\n') {
                        output.append("\t" + index + ". ");
                    } else {
                        output.append("\n\t" + index + ". ");
                    }
                    first = false;
                    index++;
                } else {
                    first = true;
                }
            }
        }
    }
}

ध्यान दें कि, जब भी हम एक नई सूची शुरू करते हैं, तब हम इंडेक्स वैल्यू को रीसेट कर रहे होते हैं, यह काम नहीं करेगा यदि आप सूची में घोंसला बनाते हैं <ol><li>1<ol><li>1.1</li><li>1.2</li></ol><li>2</li></ol>

  1. 1
    1. 1.1
    2. 1.2
  2. 2

उस कोड के साथ, आप के 1, 1, 2, 3बजाय मिल जाएगा 1, 1, 2, 2


यह कोड 23 संस्करण तक काम करता है। इसे 24 और ऊपर के लिए कैसे काम करना है?
अभिनव त्यागी

3

ज़रूर, Android TextView में गोलियां दिखाने का एक तरीका है। आप <li>टैग &#149;(जो बुलेट के लिए HTML कोड है) से बदल सकते हैं।

यदि आप अन्य सूची आइकन आज़माना चाहते हैं, तो तालिका से पसंदीदा का उपयोग करें यह लिंक है;

http://www.ascii-code.com/


मेरे लिए काम नहीं किया। इसके बजाय, एंड्रॉइड 7.1.1 और 6.0.1 पर, इसके माध्यम से एक्स वाला एक बॉक्स टेक्स्ट व्यू में बुलेट के बजाय दिखाई देता है।
user1652110

3

आप बस यूनिकोड के साथ "ली" को बदल सकते हैं

    @Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {

    if (tag.equalsIgnoreCase("li")) {
        if (opening) {
            output.append("\u2022 ");
        } else {
            output.append("\n");
        }
    }
}

2

लॉर्ड वोल्डमॉर्ट का जवाब एक अच्छा शुरुआती बिंदु है। हालाँकि मुझे गोलियों के बजाय olआदेशित सूची प्रदर्शित करने के लिए टैग की आवश्यकता थी 1. 2. 3. ....। इसके अलावा, नेस्टेड टैग को ठीक से काम करने के लिए विशेष हैंडलिंग की आवश्यकता होती है।

अपने कोड में, मैंने खुले और बंद ulऔर olटैग का ट्रैक रखने के लिए स्टैक (पेरेंटलिस्ट) बनाए रखा है और वर्तमान ओपन टैग को भी जानने के लिए। इसके अलावा, levelWiseCounterनेस्टेड olटैग के मामले में अलग-अलग काउंट को बनाए रखने के लिए उपयोग किया जाता है ।

myTextView.setText(Html.fromHtml("your string", null, new CustomTagHandler()));

। । ।

private static class CustomTagHandler implements TagHandler
   {
      int level = 0;
      private LinkedList<Tag> parentList = new LinkedList<DetailFragment.CustomTagHandler.Tag>();
      private HashMap<Integer, Integer> levelWiseCounter = new HashMap<Integer, Integer>();

      @Override
      public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader)
      {
         if (tag.equalsIgnoreCase("ul") || tag.equalsIgnoreCase("ol"))
         {
            if (opening)
            {
               if (tag.equalsIgnoreCase("ul"))
               {
                  parentList.push(Tag.UL);
               }
               else
               {
                  parentList.push(Tag.OL);
               }
               level++;
            }
            else
            {
               if (!parentList.isEmpty())
               {
                  parentList.pop();

                  //remove counter at that level, in any present.
                  levelWiseCounter.remove(level);
               }
               level--;
               if (level < 0)
               {
                  level = 0;
               }
            }
         }
         else if (tag.equalsIgnoreCase("li"))
         {
            if (opening && level > 0)
            {
               //new line check
               int length = output.toString().length();
               if (length > 0 && (output.toString().charAt(length - 1) == '\n'))
               {
               }
               else
               {
                  output.append("\n");
               }

               //add tabs as per current level of li
               for (int i = 0; i < level; i++)
               {
                  output.append("\t");
               }

               // append dot or numbers based on parent tag
               if (Tag.UL == parentList.peek())
               {
                  output.append("•");
               }
               else
               {
                  //parent is OL. Check current level and retreive counter from levelWiseCounter
                  int counter = 1;
                  if (levelWiseCounter.get(level) == null)
                  {
                     levelWiseCounter.put(level, 1);
                  }
                  else
                  {
                     counter = levelWiseCounter.get(level) + 1;
                     levelWiseCounter.put(level, counter);
                  }
                  output.append(padInt(counter) + ".");
               }

               //trailing tab
               output.append("\t");

            }
         }
      }

      /**
       * Add padding so that all numbers are aligned properly. Currently supports padding from 1-99.
       * 
       * @param num
       * @return
       */
      private static String padInt(int num)
      {
         if (num < 10)
         {
            return " " + num;
         }
         return "" + num;
      }

      private enum Tag
      {
         UL, OL
      }
   }

2

अगले कोड के बारे में कैसे ( इस लिंक पर आधारित ):

public class TextViewHtmlTagHandler implements TagHandler
  {
  /**
   * Keeps track of lists (ol, ul). On bottom of Stack is the outermost list
   * and on top of Stack is the most nested list
   */
  Stack<String>                   lists          =new Stack<String>();
  /**
   * Tracks indexes of ordered lists so that after a nested list ends
   * we can continue with correct index of outer list
   */
  Stack<Integer>                  olNextIndex    =new Stack<Integer>();
  /**
   * List indentation in pixels. Nested lists use multiple of this.
   */
  private static final int        indent         =10;
  private static final int        listItemIndent =indent*2;
  private static final BulletSpan bullet         =new BulletSpan(indent);

  @Override
  public void handleTag(final boolean opening,final String tag,final Editable output,final XMLReader xmlReader)
    {
    if(tag.equalsIgnoreCase("ul"))
      {
      if(opening)
        lists.push(tag);
      else lists.pop();
      }
    else if(tag.equalsIgnoreCase("ol"))
      {
      if(opening)
        {
        lists.push(tag);
        olNextIndex.push(Integer.valueOf(1)).toString();// TODO: add support for lists starting other index than 1
        }
      else
        {
        lists.pop();
        olNextIndex.pop().toString();
        }
      }
    else if(tag.equalsIgnoreCase("li"))
      {
      if(opening)
        {
        if(output.length()>0&&output.charAt(output.length()-1)!='\n')
          output.append("\n");
        final String parentList=lists.peek();
        if(parentList.equalsIgnoreCase("ol"))
          {
          start(output,new Ol());
          output.append(olNextIndex.peek().toString()+". ");
          olNextIndex.push(Integer.valueOf(olNextIndex.pop().intValue()+1));
          }
        else if(parentList.equalsIgnoreCase("ul"))
          start(output,new Ul());
        }
      else if(lists.peek().equalsIgnoreCase("ul"))
        {
        if(output.charAt(output.length()-1)!='\n')
          output.append("\n");
        // Nested BulletSpans increases distance between bullet and text, so we must prevent it.
        int bulletMargin=indent;
        if(lists.size()>1)
          {
          bulletMargin=indent-bullet.getLeadingMargin(true);
          if(lists.size()>2)
            // This get's more complicated when we add a LeadingMarginSpan into the same line:
            // we have also counter it's effect to BulletSpan
            bulletMargin-=(lists.size()-2)*listItemIndent;
          }
        final BulletSpan newBullet=new BulletSpan(bulletMargin);
        end(output,Ul.class,new LeadingMarginSpan.Standard(listItemIndent*(lists.size()-1)),newBullet);
        }
      else if(lists.peek().equalsIgnoreCase("ol"))
        {
        if(output.charAt(output.length()-1)!='\n')
          output.append("\n");
        int numberMargin=listItemIndent*(lists.size()-1);
        if(lists.size()>2)
          // Same as in ordered lists: counter the effect of nested Spans
          numberMargin-=(lists.size()-2)*listItemIndent;
        end(output,Ol.class,new LeadingMarginSpan.Standard(numberMargin));
        }
      }
    else if(opening)
      Log.d("TagHandler","Found an unsupported tag "+tag);
    }

  private static void start(final Editable text,final Object mark)
    {
    final int len=text.length();
    text.setSpan(mark,len,len,Spanned.SPAN_MARK_MARK);
    }

  private static void end(final Editable text,final Class<?> kind,final Object... replaces)
    {
    final int len=text.length();
    final Object obj=getLast(text,kind);
    final int where=text.getSpanStart(obj);
    text.removeSpan(obj);
    if(where!=len)
      for(final Object replace : replaces)
        text.setSpan(replace,where,len,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    return;
    }

  private static Object getLast(final Spanned text,final Class<?> kind)
    {
    /*
     * This knows that the last returned object from getSpans()
     * will be the most recently added.
     */
    final Object[] objs=text.getSpans(0,text.length(),kind);
    if(objs.length==0)
      return null;
    return objs[objs.length-1];
    }

  private static class Ul
    {
    }

  private static class Ol
    {
    }
  }

1
इस उत्तर का मूल स्रोत की तुलना में केवल थोड़ा अलग स्वरूपण है, जो इसी प्रश्न के एक अन्य उत्तर का समर्थन करने के लिए बनाया गया था: stackoverflow.com/a/17365740/262462 :)
कुइटी

सच। उस पर ध्यान नहीं दिया।
Android डेवलपर

2

मुझे समस्या थी, कि मुझे @Kuitsis समाधान वाली सूची के बाद हमेशा एक खाली रेखा मिली। मैंने हैंडलटैग () में कुछ पंक्तियाँ जोड़ीं और अब खाली लाइनें समाप्त हो गई हैं:

@Override
public void handleTag(final boolean opening, final String tag, final Editable output, final XMLReader xmlReader) {
    if (UL_TAG.equalsIgnoreCase(tag)) {
        if (opening) {   // handle <ul>
            lists.push(new Ul());
        } else {   // handle </ul>
            lists.pop();
            if (output.length() > 0 && output.charAt(output.length() - 1) == '\n') {
                output.delete(output.length() - 1, output.length());
            }
        }
    } else if (OL_TAG.equalsIgnoreCase(tag)) {
        if (opening) {   // handle <ol>
            lists.push(new Ol()); // use default start index of 1
        } else {   // handle </ol>
            lists.pop();
            if (output.length() > 0 && output.charAt(output.length() - 1) == '\n') {
                output.delete(output.length() - 1, output.length());
            }
        }
    } else if (LI_TAG.equalsIgnoreCase(tag)) {
        if (opening) {   // handle <li>
            lists.peek().openItem(output);
        } else {   // handle </li>
            lists.peek().closeItem(output, lists.size());
        }
    } else {
        Log.d("TagHandler", "Found an unsupported tag " + tag);
    }
}

2

आप उपयोग कर सकते हैं Html.TagHandler। नीचे कोटलिन के लिए इस्तेमाल किया जा सकता है

    class UlTagHandler : Html.TagHandler {
    override fun handleTag(
        opening: Boolean, tag: String, output: Editable,
        xmlReader: XMLReader
    ) {
        if (tag == "ul" && !opening) output.append("\n")
        if (tag == "li" && opening) output.append("\n\t•")
    }
}

तथा

textView.setText(Html.fromHtml(myHtmlText, null, UlTagHandler()));

0

यह इस बात की पुष्टि है कि कासिम ने क्या कहा है। विखंडन है। मैंने पाया कि इसे कैसे हल किया जाए। मुझे <li>एक कस्टम टैग में नाम बदलना और उलटना है। इसलिए:

myHTML.replaceAll("</ul>","</customTag>").replaceAll("<ul>","<customTag>");
//likewise for li

तब मेरे हैंडलर में मैं उस कस्टमटैग (जो कुछ नहीं करता है) की तलाश कर सकता हूं और कुछ कर सकता हूं।

//now my handler can handle the customtags. it was ignoring them after nougat. 
 public class UlTagHandler implements Html.TagHandler {
        //for ul in nougat and up this tagHandler is completely ignored
        @Override
        public void handleTag(boolean opening, String tag, Editable output,
                              XMLReader xmlReader) {

            if (tag.equals("customtag2") && opening)
            output.append("\n\t\u25CF\t");
        if (tag.equals("customtag2") && !opening)
            output.append("\n");
        }
    }

यह Android के सभी संस्करणों के लिए काम करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.