এইচটিএমএল তালিকা ট্যাগ অ্যান্ড্রয়েড পাঠ্যদর্শনটিতে কাজ করছে না। আমি কি করতে পারি?


101

এইচটিএমএল তালিকা ট্যাগ অ্যান্ড্রয়েড টেক্সটভিউতে কাজ করছে না। এটি আমার স্ট্রিং সামগ্রী:

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

4
টেক্সট / এইচটিএমএল নয় পাঠ্য / এইচটিএমএল হওয়া উচিত।
ক্লো

উত্তর:


159

আপনি যেমন 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);

তাহলে এটিকে সংশোধন করতে আমি কী করতে পারি?
প্রবীণ

4
এই "অনুমোদিত" ট্যাগগুলির কয়েকটি বৈশিষ্ট্য নোট করা খুব গুরুত্বপূর্ণ too : = (
জর্জেসিস

4
শান্ত হোন ... আমি আমার উত্তর সম্পাদনা করেছি, দয়া করে আমাকে জানান যে এটি কার্যকর হয় কিনা।
ক্রিশ্চিয়ান

6
আপনি আসলে একইভাবে কোনও ওয়েবভিউ ব্যবহার করতে পারবেন না, সুতরাং এটি আসলে কোনও সমস্যার সমাধান নয়।
ব্রিল প্যাপিন

11
কীভাবে সমাধান হয়? আপনি টেক্সটভিউয়ের সাথে তুলনা করে কেবল একটি ওয়েবভিউ ব্যবহার করতে পারবেন না এটি একটি খুব ব্যয়বহুল উইজেট। আপনার কাছে থাকা প্রতিটি ফর্ম্যাট পাঠ্যের জন্য আপনি কেবল ওয়েবভিউ ব্যবহার করতে পারবেন না।
স্পেসমুনকি

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

[সম্পাদনা]

কুইત્সিও একটি সত্যিই ভাল লাইব্রেরি পোস্ট করেছেন যা একই কাজ করে, এটি এই এসও লিঙ্ক থেকে পেয়েছে ।


আমরা শেষ পর্যন্ত এই পদ্ধতির ব্যবহার করেছি। কোনও অসমর্থিত এইচটিএমএল ট্যাগ, আমরা নিজেরাই টেক্সটে কোড করি। আপাতত এটি ঠিক ওল এবং উল, তবে তালের নেস্টিং পরিচালনা করার জন্য এবং ওল বাসা করার সময় সূচীগুলি সংরক্ষণ করার জন্য আমরা স্ট্যাকগুলিতে যুক্ত করেছি। এছাড়াও আপনি প্রথমটির প্রতিস্থাপনে উদ্বোধনী বুলিয়ান প্যারামিটারটি ব্যবহার করতে পারেন।
জনউইলিস

6
@ আমান গৌতম এর জন্য খুব দুর্দান্ত ধন্যবাদ! পাঠ্যটি যখন 1 টিরও বেশি লাইনে আবদ্ধ থাকে তখন কীভাবে ট্যাব করবেন তা আপনার কী ধারণা আছে? এই কোডের সাহায্যে ২ য় লাইনের পরে পাঠ্যটি নম্বর পৃথক রাখতে ট্যাবডের পরিবর্তে সংখ্যাটির সাথে সংযুক্ত করা হয়। আমি কয়েকটি জিনিস চেষ্টা করেছিলাম কিন্তু আমি তা বের করতে পারি না
রায়ানজি

এখানে একই জিনিস, একটি তালিকার লাইন ব্রেকগুলি এই পদ্ধতির সাথে ট্রোবুলের কারণ করে।
Andreas Rudolph

আটকানো বুলেট অক্ষরটি ব্যবহার না করে, ইউনিকোড অক্ষর ব্যবহার করা ভাল: আউটপুট.অ্যাপেন্ড ("\ n \ t \ u2022");
ম্যাট ম্যাকমিন

এই দুর্দান্ত কোডের জন্য আপনাকে ধন্যবাদ, তবে আমি একাধিক লাইন ইনডেন্টেশন ঠিক করার কীভাবে কোনও সমাধান খুঁজে না পাচ্ছি ততক্ষণ আমি এটি ব্যবহার করতে পারছি না
পিটার.বার্তোস

68

সম্পূর্ণ নমুনা প্রকল্পটি https://bitbucket.org/Kitsi/android-textview-html-list এ অবস্থিত ।
নমুনা চিত্রটি https://kitsi.bitbucket.io/stackoverflow3150400_screen.png এ উপলব্ধ

এই সমাধানটি মাশার উত্তরের নিকটতম । কিছু কোড অভ্যন্তরীণ শ্রেণী থেকে নেওয়া হয় android.text.Html.HtmlToSpannedConverter। এটি নেস্টেড অর্ডারযুক্ত এবং আনর্ডারড তালিকাগুলি সমর্থন করে তবে অর্ডার তালিকাগুলিতে খুব দীর্ঘ পাঠ্যগুলি এখনও পাঠ্যের পরিবর্তে আইটেম সংখ্যার সাথে একত্রিত হয়। মিশ্র তালিকাগুলি (ওল ও উল) এরও কিছু কাজ প্রয়োজন। নমুনা প্রকল্পে Html.TagHandler এর প্রয়োগ রয়েছে যা Html.fromHtml (স্ট্রিং, ইমেজজেটার, ট্যাগহ্যান্ডলার) এ দেওয়া হয়েছে

সম্পাদনা করুন: বৃহত্তর এইচটিএমএল ট্যাগ সহায়তার জন্য, https://github.com/NightWhistler/HtmlSpanner চেষ্টা করার মতোও হতে পারে।


এখন পর্যন্ত সেরা সমাধান। আপনাকে ধন্যবাদ
peter.bartos

BitBucket রেপো কোন ইস্যু ট্র্যাকিং, এখানে পোস্ট করার তাই: আপনি চেক যোগ করতে হবে এখানে এবং এখানে জন্য output.length() > 0হিসাবেif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
mindeh

4
এটিতে অন্য লোকদের 2 ঘন্টা অপচয় করা এড়াতে, নাইটউইস্টলার এইচটিএমএলস্প্যানার অজানা কারণে যাবতীয় উচ্চারণযুক্ত অক্ষরগুলি সরিয়ে দেয়।
এপিকপান্ডাফোরস

@ কিউটি সমাধানের জন্য ধন্যবাদ thanks এটিতে একটি সমস্যা রয়েছে, যখন এইচটিএমএল পাঠ্যটি "<ul> <li> কিছু </ li> </ul>" হয়, তারপরে "" কিছুতে "শেষ বর্ণটি তালিকায় প্রদর্শিত হয় না।
স্যাম বার্গ

এটি একটি খুব ভাল সমাধান, তবে দুটি ত্রুটি: 1) এটি অ্যান্ড্রয়েড support 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

আদেশ তালিকা সম্পর্কে কি?
অ্যান্ড্রয়েড বিকাশকারী 15

13

সতর্কতা

10 ই ফেব্রুয়ারী, 2016 পর্যন্ত android.text.Htmlআসলে সমর্থন করে liএবং ulট্যাগ করে এবং একটি বেসিক ব্যবহার করে new BulletSpan()যার অর্থ Android এর সর্বশেষ সংস্করণে Html.TagHandlerএখানে পোস্ট করা সমাধানগুলি উপেক্ষা করা হবে

আপনি ডিফল্টর চেয়ে বড় ফাঁক দিয়ে বুলেটস্প্যানের প্রত্যাশার ক্ষেত্রে আপনার কোডটি এই পরিবর্তনটি সামলানো হয়েছে তা নিশ্চিত করুন, আপনার কোনও ধরণের সমাধান থাকতে হবে যা স্প্যানগুলির সন্ধান / প্রতিস্থাপন করবে some


4
তবে এই নতুন এইচটিএমএল ক্লাসটি কেবল অ্যান্ড্রয়েড Nএবং তারপরের উপর উপলব্ধ ।
সাকিবয়

4
হ্যাঁ - যাতে আপনার বিভিন্ন অ্যাকাউন্টের বিভিন্ন অ্যাকাউন্টের ভিন্নরূপে আচরণ করা দরকার for অতএব আমি কেন এমন কোনও সমাধানের প্রস্তাব দিচ্ছি যা বুলেটস্প্যানের অনুসন্ধান এবং প্রতিস্থাপনের পরে এইচটিএমএলকে বিভিন্ন স্প্যানে বিভক্ত করার পরে। এন এর পরে সংস্করণগুলির ডিফল্ট প্রয়োগকরণ একটি ডিফল্ট মার্জিন ব্যবহার করবে, আপনি এটি আপনার পছন্দসই মার্জিনের সাথে সন্ধান এবং প্রতিস্থাপন করতে পারেন।
কাসিম

সর্বদা আপ টু ডেট রাখুন।
কাই ওয়াং

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
কুয়েটসি

সুন্দর সমাধানের জন্য ধন্যবাদ! এটি একাধিক লাইন
পাঠ্যকেও অন্তর্ভুক্ত করে

4
কেন আপনি সাধারণ অ্যারেলিস্টের পরিবর্তে ভেক্টর ব্যবহার করেন? একটি ভেক্টর একাধিক থ্রেডের জন্য ...
অ্যান্ড্রয়েড বিকাশকারী

@ অ্যান্ড্রয়েড ডেভেলপার সি ++ প্রোগ্রামার, আমার খারাপ, উত্তরটি সম্পাদন করতে নির্দ্বিধায়
মাশা


8

আপনার যদি কেবল একটি তালিকা ফর্ম্যাট করতে হয় তবে এটিকে সহজ রাখুন এবং একই ফলাফলটি অর্জন করতে আপনার টেক্সটভিউতে একটি ইউনিকোড অক্ষর অনুলিপি / অনুলিপি করুন।

• ইউনিকোড অক্ষর 'বুলেট' (U + 2022)


6

আমি ট্যাগহ্যান্ডলার বাস্তবায়ন সন্ধানে এখানে এসেছি। ট্রুং এনগুইন এবং আমান গুয়াতামের উত্তর দুটিই খুব সুন্দর, তবে আমার উভয়ের মিশ্র সংস্করণ দরকার: এটির ওভারফর্ম্যাট না করার জন্য এবং ট্যাগগুলি পুনরায় সমাধান করতে সক্ষম হওয়ার জন্য আমার সমাধানের দরকার ছিল <ol>, কারণ আমি এর মতো কিছু পার্স করছি since<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
    2. ১.২

এই কোডটি দিয়ে আপনি এর 1, 1, 2, 3পরিবর্তে পাবেন 1, 1, 2, 2


এই কোডটি সংস্করণ 23 পর্যন্ত কাজ করে 24
অভিনব তায়াগি

3

অবশ্যই, অ্যান্ড্রয়েড টেক্সটভিউতে বুলেটগুলি দেখানোর একটি উপায় রয়েছে। আপনি এর <li>সাথে ট্যাগগুলি প্রতিস্থাপন করতে পারেন&#149; (যা বুলেটের জন্য এইচটিএমএল কোড)।

আপনি যদি অন্য তালিকার আইকন চেষ্টা করতে চান, সারণী থেকে পছন্দসই একটি ব্যবহার করুন এই লিঙ্কটি;

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


আমার পক্ষে কাজ করেনি। পরিবর্তে, অ্যান্ড্রয়েড 7.1.1 এবং 6.0.1 এ, টেক্সটভিউতে বুলেটটির পরিবর্তে এর মাধ্যমে একটি এক্স সহ একটি বাক্স উপস্থিত হবে।
ব্যবহারকারী1652110

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

4
এই উত্তর শুধুমাত্র সামান্য এই মূল উৎস, এই একই প্রশ্নের আরেকটি উত্তর সমর্থনের জন্য তৈরি করা হয়েছে যা তুলনায় বিন্যাস বিভিন্ন হয়েছে stackoverflow.com/a/17365740/262462 :)
Kuitsi

সত্য। তা খেয়াল করেনি।
অ্যান্ড্রয়েড বিকাশকারী

2

আমার সমস্যা ছিল, আমি @ কুটসিস সমাধানের সাথে তালিকার পরে সর্বদা একটি খালি লাইন পেয়েছি। আমি হ্যান্ডেলট্যাগ () এ কয়েকটি লাইন যুক্ত করেছি এবং এখন খালি লাইনগুলি চলে গেছে:

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

এটি এন্ড্রয়েডের সমস্ত সংস্করণের জন্য কাজ করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.