Html Listesi etiketi android metin görünümünde çalışmıyor. Ne yapabilirim?


99

Html List etiketi android TextView'da çalışmıyor. Bu benim dize içeriğim:

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

Bunu aşağıdaki gibi bir metin görünümüne yükledim:

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

Çıktı bir paragrafa benziyor. Ne yapabilirim? Bunun için herhangi bir çözüm var mı?

Düzenle:

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

1
Text / html olmalı, texl / html olmamalıdır.
Chloe

Yanıtlar:


156

Eğer görebileceğiniz gibi Htmlsınıf kaynak kodu , Html.fromHtml(String)tüm HTML etiketlerini desteklemez. Bu çok durumda <ul>ve <li>desteklenmiyor.

Kaynak koddan izin verilen HTML etiketlerinin bir listesini oluşturdum:

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

Yani daha iyi kullan WebViewve loadDataWithBaseURLyöntemini kullan. Bunun gibi bir şey dene:

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

o zaman düzeltmek için ne yapabilirim?
Praveen

2
Bu "izin verilen" etiketlerin bazı özniteliklerinin de desteklenmediğini unutmamak çok önemlidir. : = (
Jorgesys

2
Sakin ol ... Cevabımı düzenledim, lütfen işe yarayıp yaramadığını bana bildirin.
Cristian

6
Aslında bir Web Görünümü'nü aynı şekilde kullanamazsınız, bu nedenle bu aslında sorun için bir çözüm değildir.
Brill Pappin

11
Bu nasıl bir çözüm? Sadece bir Web Görünümü kullanamazsınız, bu bir TextView ile karşılaştırıldığında çok pahalı bir widgettır. Sahip olduğunuz her biçimlendirilmiş metin için bir Web Görünümü kullanamazsınız.
SpaceMonkey

135

Ben de aynı sorunu yaşıyorum, yaptığım şey varsayılan TagHandler'ı geçersiz kılmak . Bu benim için çalıştı.

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

ve metni görüntülemek için ...

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

[Düzenle]

Kuitsi de aynı şeyi yapan gerçekten iyi bir kitaplık yayınladı , bu SO bağlantısından aldı .


Sonunda bu yaklaşımı kullandık. Desteklenmeyen herhangi bir HTML etiketi, metni kendimiz kodluyoruz. Şimdilik sadece ol ve ul, ancak listelerin iç içe geçmesi ve ol'u iç içe geçirirken dizinlerin depolanması için yığınlar ekledik. Ek olarak açılış boole parametresini birincinin yerine kullanabilirsiniz.
JonWillis

6
@Aman Gautam bunun için çok harika teşekkürler! Metni 1 satırdan fazla kaydırdığında nasıl sekmeyeceğiniz hakkında bir fikriniz var mı? 2. satırdan sonraki bu kodla, numarayı ayrı tutmak için metin sekme yerine numara ile hizalanır. Birkaç şey
denedim

burada da aynı şey, bir listedeki satır kırılmaları bu yaklaşımla trobule neden olur.
Andreas Rudolph

Yapıştırılan madde işareti karakterini kullanmak yerine, unicode karakterini kullanmak daha iyi olabilir: output.append ("\ n \ t \ u2022");
Matt McMinn

Bu güzel kod için teşekkür ederim, ancak çoklu satır girintisini nasıl düzelteceğimizi bir çözüm bulana kadar kullanamam
peter.bartos

68

Tam örnek proje https://bitbucket.org/Kuitsi/android-textview-html-list adresinde bulunmaktadır .
Örnek resim https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png adresinde mevcuttur.

Bu çözüm, masha'nın cevabına en yakın olanıdır . Bazı kodlar da iç sınıftan alınır android.text.Html.HtmlToSpannedConverter. Yuvalanmış sıralı ve sırasız listeleri destekler, ancak sıralı listelerdeki çok uzun metinler yine de metin yerine öğe numarasıyla hizalanır. Karışık listeler (ol ve ul) da biraz çalışmaya ihtiyaç duyar. Örnek proje, Html.fromHtml'ye (String, ImageGetter, TagHandler) iletilen Html.TagHandler uygulamasını içerir .

Düzenleme: Daha geniş HTML etiketi desteği için https://github.com/NightWhistler/HtmlSpanner da denemeye değer olabilir.


Şimdiye kadar en iyi çözüm. Teşekkür ederim
peter.bartos

BitBucket deposunda sorun takibi yok, bu yüzden burada yayınlayın: burada ve burada olduğu output.length() > 0gibi çek eklemeniz gerekirif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
mindeh

2
NightWhistler HtmlSpanner, başkalarının bu konuda 2 saatini boşa harcamasını önlemek için, bilinmeyen herhangi bir nedenle tüm aksanlı karakterleri kaldırır.
EpicPandaForce

@Kuitsi çözüm için teşekkürler. Bununla ilgili bir sorun var, html metni "<ul> <li> bir şey </li> </ul>" olduğunda, "bir şey" deki son harf listede görüntülenmiyor.
Sam Berg

Bu çok iyi bir çözüm, AMA iki dezavantajı var: 1) Android ≥ 7'yi desteklemiyor ve 2) listenin ilk seviyesi için başlangıç ​​girintisi koymuyor.
soshial

24

Aman Guatam koduna küçük bir düzeltme. Yukarıdaki işlevin satırsonu karakteri oluşturma sorunu vardır. Örneğin: <li>etiketten önce bir etiket ise <p>, 2 yeni satır karakteri oluşturulur. İşte yükseltilmiş kod:

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

Basit ama etkili
steven0529

Sıralı liste ne olacak?
android geliştiricisi

13

UYARI

10 Şubat 2016 itibarıyla bir android.text.Htmlbasic'i destekliyor li, uletiketler ve kullanıyor new BulletSpan(), bu da Android'in en son sürümlerinde Html.TagHandlerburada yayınlanan çözümlerin yok sayılacağı anlamına geliyor

Varsayılandan daha büyük bir boşluğa sahip bir BulletSpan bekliyorsanız, kodunuzun bu değişikliği ele aldığından emin olun, aralıkları bulup değiştiren bir tür çözüme sahip olmanız gerekir.


4
Ancak bu yeni Html sınıfı yalnızca Android Nve sonraki sürümlerde kullanılabilir .
Sakiboy

1
Evet - bu nedenle, farklı işletim sistemi sürümlerinin farklı davranacağı gerçeğini hesaba katmanız gerekir. Bu nedenle, HTML farklı aralıklara ayrıştırıldıktan sonra BulletSpan'i bulup değiştiren bir çözüm öneriyorum. N'den sonraki sürümlerin varsayılan uygulaması varsayılan bir kenar boşluğu kullanacaktır, bunları bulabilir ve istediğiniz kenar boşluğuyla değiştirebilirsiniz.
kassim

Daima güncel kalın.
Kai Wang

9

LeadingMarginSpan kullanarak farklı çözüm. Sıralı ve sırasız listeleri ve iç içe yerleştirmeyi işler.

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
Spans kullanma fikrini beğendim, ancak bu kodla çalışan iç içe geçmiş liste alamıyorum. Her iki hat output.setSpan(...)dajava.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
Kuitsi 8'13

Güzel çözüm için teşekkürler! Aynı zamanda çok satırlı metinleri girintiler
peter.bartos

2
neden basit bir ArrayList yerine Vector kullanıyorsunuz? a Vector, çoklu iş parçacıkları içindir ...
android geliştiricisi

@androiddeveloper c ++ programcısı, benim hatam, cevabı düzenlemekten çekinmeyin
masha


8

Yalnızca bir listeyi biçimlendirmeniz gerekiyorsa, aynı sonucu elde etmek için basit tutun ve TextView'unuzda bir unicode karakteri kopyalayın / yapıştırın.

• Unicode Karakter 'BULLET' (U + 2022)


6

Buraya TagHandler uygulamalarını aramaya geldim. Hem Truong Nguyen hem de Aman Guatam'ın cevapları çok güzel, ancak ikisinin de karışık bir versiyonuna ihtiyacım vardı: Çözümü aşırı formatlamamak ve <ol>etiketleri yeniden çözmek için ihtiyacım vardı , çünkü böyle bir şeyi ayrıştırıyorum <h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>.

İşte benim çözümüm.

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

Yeni bir liste başladığında dizin değerini sıfırladığımız için, listeleri aşağıdaki gibi iç içe yerleştirirseniz ÇALIŞMAYACAĞINI unutmayın. <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

Bu kodla, 1, 1, 2, 3yerine alırsınız 1, 1, 2, 2.


Bu kod sürüm 23'e kadar çalışır. 24 ve üzeri için nasıl çalıştırılır?
Abhinav Tyagi

3

Elbette, Android TextView'da madde işaretlerini göstermenin bir yolu var. Sen yerine <li>etiketleri &#149;(mermi için HTML kodu olan).

Diğer liste simgelerini denemek isterseniz, tablodan tercih edileni kullanın bu bağlantı;

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


Benim için çalışmadı. Bunun yerine, Android 7.1.1 ve 6.0.1'de, TextView'daki madde işareti yerine x üzerinden geçen bir kutu görünür.
user1652110

3

"Li" yi unicodes ile değiştirebilirsiniz.

    @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

Lord Voldermort'un cevabı iyi bir başlangıç ​​noktasıdır. Bununla birlikte , madde işaretleri yerine olsıralı listeyi görüntülemek için etiket gerekiyordu 1. 2. 3. ..... Ayrıca, iç içe geçmiş etiketlerin düzgün çalışması için özel işlem yapılması gerekir.

Benim kodunda, ben açtı ve kapalı izlemek için yığın (parentList) korumuştur ulve oletiketleri ve aynı zamanda mevcut açık etiketi bilmek. Ayrıca, levelWiseCounteriç içe geçmiş oletiketlerde farklı sayıları korumak için a kullanılır .

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

Bir sonraki koda ne dersiniz ( bu bağlantıya göre ):

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
Bu yanıt, aynı soruya başka bir yanıtı desteklemek için oluşturulan orijinal kaynağına kıyasla yalnızca biraz farklı biçimlendirmeye sahiptir: stackoverflow.com/a/17365740/262462 :)
Kuitsi 14

doğru. bunu fark etmedi.
android geliştiricisi

2

@Kuitsis çözümü ile bir listeden sonra her zaman boş bir satırım olması problemini yaşadım. HandleTag () 'e birkaç satır ekledim ve şimdi boş satırlar gitti:

@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

Kullanabilirsiniz Html.TagHandler. Aşağıda kotlin için kullanılabilir

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

ve

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

0

bu, Kassim'in söylediği şeyin teyidi. parçalanma var. Bunu nasıl çözeceğimi buldum. <li>Özel bir etiketi yeniden adlandırmam ve ul etmem gerekiyor. yani:

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

sonra işleyicimde o customTag'i arayabilirim (hiçbir şey yapmaz) ve bir şeyler yapmasını sağlayabilirim.

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

bu, tüm android sürümleri için çalışmasını sağlamalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.