Tag Daftar Html tidak berfungsi di textview android. apa yang dapat saya?

99

Tag Daftar Html tidak berfungsi di TextView android. Ini adalah konten string saya:

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

Saya memuatnya dalam tampilan teks seperti ini:

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

Outputnya terlihat seperti paragraf. Apa yang dapat saya? Apakah ada solusi untuk itu?

Edit:

webview.loadData(str,"text/html","utf-8");
Praveen
sumber
1
Harus teks / html bukan texl / html.
Chloe

Jawaban:

156

Seperti yang Anda lihat di Htmlkode sumber kelas , Html.fromHtml(String)tidak mendukung semua tag HTML. Dalam kasus ini, <ul>dan <li>tidak didukung.

Dari kode sumber saya telah membuat daftar tag HTML yang diizinkan:

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

Jadi sebaiknya Anda menggunakan WebViewdan loadDataWithBaseURLmetodenya. Coba sesuatu seperti ini:

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);
Cristian
sumber
lalu apa yang dapat saya lakukan untuk memperbaikinya?
Praveen
2
sangat penting untuk diperhatikan beberapa atribut dari tag "diperbolehkan" ini tidak didukung juga. : = (
Jorgesys
2
Tenang ... Saya mengedit jawaban saya, beri tahu saya apakah berhasil.
Cristian
6
Anda tidak dapat benar-benar menggunakan WebView dengan cara yang sama, jadi ini sebenarnya bukan solusi untuk masalah.
Brill Pappin
11
Bagaimana itu solusinya? Anda tidak bisa hanya menggunakan WebView, ini adalah widget yang sangat mahal dibandingkan dengan TextView. Anda tidak bisa hanya menggunakan WebView untuk setiap teks berformat yang Anda miliki.
SpaceMonkey
135

Saya mengalami masalah yang sama, yang saya lakukan adalah mengganti TagHandler default . Yang ini berhasil untuk saya.

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

dan untuk menampilkan teks ...

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

[Sunting]

Kuitsi juga memposting perpustakaan yang sangat bagus yang melakukan hal yang sama, mendapatkannya dari tautan SO ini .

Aman Gautam
sumber
Kami menggunakan pendekatan ini pada akhirnya. Setiap tag HTML yang tidak didukung, kami membuat kode sendiri dalam teks. Untuk saat ini hanya ol dan ul, tapi kami menambahkan di tumpukan untuk menangani daftar bersarang dan menyimpan indeks saat menumpuk ol. Selain itu, Anda dapat menggunakan parameter boolean pembuka sebagai pengganti first.
JonWillis
6
@Aman Gautam terima kasih yang sangat luar biasa untuk ini! Apakah Anda tahu cara men-tab teks saat membungkus lebih dari 1 baris? Dengan kode ini setelah baris ke-2, teks diratakan dengan nomor daripada tab untuk menjaga nomor tetap terpisah. Saya mencoba beberapa hal tetapi saya tidak bisa memahaminya
RyanG
hal yang sama di sini, pemutusan baris dalam daftar menyebabkan masalah dengan pendekatan ini.
Andreas Rudolph
Daripada menggunakan karakter poin yang ditempelkan, mungkin lebih baik menggunakan karakter unicode: output.append ("\ n \ t \ u2022");
Matt McMinn
Terima kasih untuk kode yang bagus ini, tetapi saya tidak dapat menggunakannya sampai kita akan menemukan solusi bagaimana memperbaiki indentasi beberapa baris
peter.bartos
68

Proyek sampel lengkap ada di https://bitbucket.org/Kuitsi/android-textview-html-list .
Contoh gambar tersedia di https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png

Solusi ini paling mendekati jawaban Masha . Beberapa kode juga diambil dari kelas dalam android.text.Html.HtmlToSpannedConverter. Ini mendukung daftar tersusun dan tidak berurutan tetapi teks yang terlalu panjang dalam daftar berurutan masih selaras dengan nomor item daripada teks. Daftar campuran (ol dan ul) juga perlu diperbaiki. Proyek contoh berisi implementasi Html.TagHandler yang diteruskan ke Html.fromHtml (String, ImageGetter, TagHandler) .

Edit: Untuk dukungan tag HTML yang lebih luas, https://github.com/NightWhistler/HtmlSpanner mungkin juga patut untuk dicoba.

Kuitsi
sumber
Sejauh ini solusi terbaik. Terima kasih
peter.bartos
Tidak ada masalah pelacakan di repo BitBucket, jadi posting di sini: Anda perlu menambahkan cek di sini dan di sini untuk output.length() > 0seperti dalamif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
mindeh
2
Hanya untuk menghindari orang lain membuang-buang waktu 2 jam untuk ini, NightWhistler HtmlSpanner menghapus semua karakter beraksen untuk alasan yang tidak diketahui.
EpicPandaForce
@Krisnawati Ada satu masalah dengannya, jika teks html adalah "<ul> <li> sesuatu </li> </ul>", maka huruf terakhir dalam "sesuatu" tidak ditampilkan dalam daftar.
Sam Berg
Ini adalah solusi yang sangat bagus, TAPI dua kekurangannya: 1) tidak mendukung Android ≥ 7 dan 2) tidak menempatkan indentasi awal untuk daftar tingkat pertama.
soshial
24

Perbaikan kecil untuk kode Aman Guatam. Fungsi di atas bermasalah dalam merender karakter baris baru. Misalnya: jika sebelum <li>tag adalah <p>tag, 2 karakter baris baru dirender. Ini kode yang ditingkatkan:

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;
            }
        }
    }
}
Truong Nguyen
sumber
Sederhana namun efektif
steven0529
Bagaimana dengan daftar yang dipesan?
Pengembang android
13

PERINGATAN

per 10 Feb 2016 android.text.Htmlsebenarnya mendukung lidan memberi ultag dan menggunakan dasar new BulletSpan(), yang berarti di versi terbaru Android, Html.TagHandlersolusi yang diposting di sini akan diabaikan

pastikan kode Anda menangani perubahan ini jika Anda mengharapkan BulletSpan dengan celah yang lebih besar dari default, Anda harus memiliki semacam solusi yang melakukan pencarian / penggantian span

kassim
sumber
4
Tapi kelas Html baru itu hanya tersedia di Android Ndan di atasnya.
Sakiboy
1
Ya - jadi Anda perlu memperhitungkan fakta bahwa versi OS yang berbeda akan berperilaku berbeda. Oleh karena itu mengapa saya merekomendasikan solusi yang menemukan dan menggantikan BulletSpan setelah HTML diurai menjadi span yang berbeda. Implementasi default versi setelah N akan menggunakan margin default, Anda dapat menemukan dan menggantinya dengan margin yang Anda inginkan.
kassim
Selalu up to date.
Kai Wang
9

Solusi berbeda menggunakan LeadingMarginSpan. Menangani daftar yang tertata dan tidak berurutan serta bersarang.

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 );
        }
    }
}
masha
sumber
5
Saya suka ide menggunakan Spans tetapi saya tidak bisa mendapatkan daftar bersarang yang bekerja dengan kode ini. Kedua jalur output.setSpan(...)crash denganjava.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
Kuitsi
Terima kasih untuk solusi yang bagus! Ini juga mengindentasi beberapa teks baris
peter.bartos
2
mengapa Anda menggunakan Vector daripada ArrayList sederhana? a Vector adalah untuk multi utas ...
pengembang android
@androiddeveloper c ++ programmer, my bad, silakan edit jawabannya
masha
1
Saya telah memposting sebagai Cuplikan androidsnippets.com/…
Pratik Butani
8

Jika Anda hanya perlu memformat daftar, buatlah tetap sederhana dan salin / tempel karakter unicode di TextView Anda untuk mendapatkan hasil yang sama.

• Karakter Unicode 'BULLET' (U + 2022)

Naku
sumber
6

Saya datang ke sini mencari implementasi TagHandler. Baik jawaban Truong Nguyen dan Aman Guatam sangat bagus, tetapi saya membutuhkan versi campuran keduanya: Saya membutuhkan solusi saya untuk tidak memformatnya secara berlebihan dan untuk dapat memecahkan ulang <ol>tag, karena saya mengurai sesuatu seperti <h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>.

Inilah solusi saya.

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

Perhatikan bahwa, karena kami menyetel ulang nilai indeks setiap kali daftar baru dimulai, ini TIDAK AKAN berfungsi jika Anda menyusun daftar seperti di <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

Dengan kode itu, Anda akan mendapatkan 1, 1, 2, 3bukan 1, 1, 2, 2.

Charlie-Blake
sumber
Kode ini berfungsi hingga versi 23. Bagaimana membuatnya berfungsi untuk 24 dan di atasnya?
Abhinav Tyagi
3

Tentu, ada cara untuk menampilkan peluru di Android TextView. Anda dapat mengganti <li>tag dengan &#149;(yang merupakan kode HTML untuk poin).

Jika Anda ingin mencoba ikon daftar lainnya, gunakan ikon yang disukai dari tabel adalah tautan ini;

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

Taner
sumber
Tidak berhasil untuk saya. Alih-alih, di Android 7.1.1 dan 6.0.1, sebuah kotak dengan tanda x melewatinya akan muncul sebagai ganti butir di TextView.
pengguna1652110
3

Anda cukup mengganti "li" dengan unicodes

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

Jawaban Lord Voldermort adalah titik awal yang baik. Namun saya membutuhkan oltag untuk menampilkan daftar yang dipesan 1. 2. 3. ....alih-alih peluru. Selain itu, tag berlapis memerlukan penanganan khusus agar berfungsi dengan baik.

Dalam kode saya, saya telah mempertahankan stack (parentList) untuk melacak dibuka dan ditutup uldan oltag dan juga untuk mengetahui tag terbuka saat ini. Selain itu, a levelWiseCounterdigunakan untuk mempertahankan jumlah yang berbeda dalam kasus oltag bertingkat .

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
      }
   }
Kshitij
sumber
2

Bagaimana dengan kode selanjutnya (berdasarkan tautan ini ):

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
    {
    }
  }
pengembang android
sumber
1
Jawaban ini hanya memiliki format yang sedikit berbeda dibandingkan dengan sumber aslinya, yang dibuat untuk mendukung jawaban lain untuk pertanyaan yang sama ini: stackoverflow.com/a/17365740/262462 :)
Kuitsi
benar. tidak menyadarinya.
pengembang android
2

Saya punya masalah, bahwa saya selalu mendapat baris kosong setelah daftar dengan solusi @Kuitsis. Saya menambahkan beberapa baris di handleTag () dan sekarang baris kosong hilang:

@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);
    }
}
JensJensen
sumber
2

Anda bisa menggunakan Html.TagHandler. Di bawah ini dapat digunakan untuk kotlin

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

dan

textView.setText(Html.fromHtml(myHtmlText, null, UlTagHandler()));
Shalu TD
sumber
0

ini adalah penegasan atas apa yang dikatakan kassim. ada fragmentasi. saya menemukan cara menyelesaikan ini. saya harus mengganti nama <li>dan ul menjadi tag kustom. begitu:

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

kemudian di handler saya, saya bisa mencari customTag itu (yang tidak melakukan apa-apa) dan membuatnya melakukan sesuatu.

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

ini harus membuatnya bekerja untuk semua versi android.

j2emanue
sumber