Jump to content
  • 0

Android SpannableString a Drawable


jenkings

Dotaz

Čaute, potřebuju nějakého Android Guru, co dělá v Javě a poradí řešení velice zapeklitého problému.

 

Chci v TextView vykreslit kolem každého jednotlivého znaku čtverec. Po dlouhém bádání jsem došel k následujícímu kódu:
 

TextView sentenceTV = gsa.findViewById(R.id.sentenceTV);
      SpannableStringBuilder builder = new SpannableStringBuilder();
      for(int i = 0; i < currentSentence.length();i++){

          try {
              String letter = currentSentence.getString(i); //currentSentence js JSONArray (pole znaků)
              Drawable d = gsa.getResources().getDrawable(R.drawable.letter_square);
              d.setBounds(0, 10, d.getIntrinsicWidth(), d.getIntrinsicHeight());
              ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
              SpannableString letterSpannable = new SpannableString(letter);
              letterSpannable.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    //Tady je zakopaný pes
              letterSpannable.setSpan(new ForegroundColorSpan(Color.RED), 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
              builder.append(letterSpannable);


          } catch (JSONException e) {
              e.printStackTrace();
          }

      }
      sentenceTV.setText(builder, TextView.BufferType.SPANNABLE);

 

Což je zatím nejvíc, kam jsem se dostal. Problém je, že mi funguje buď zobrazení textu, nebo jen všech rámečků na jednotlivé znaky, ale chybí v nich text.

Tzn. když zakomentuju :

letterSpannable.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

Tak se zobrazí v TextView obyčejný text. Když to nezakomentuju, zobrazí se místo každého znaku čtvereček, ale jaksi v něm zase chybí ten znak

Link to comment
Share on other sites

5 odpovědí na tuto otázku

Recommended Posts

  • 0
  • Globální moderátor

Co to udělat takhle?

 

public class SquareBackgroundSpan extends ReplacementSpan {

  private int mSize;
  private int mColor;

  public SquareBackgroundSpan(int size, int color) {
    mSize = size;
    mColor = color;
  }

  @Override
  public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
    return mSize;
  }

  @Override
  public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
    paint.setColor(mColor);
    canvas.drawRect(x, top, x + mSize, bottom, paint);
    paint.setColor(Color.WHITE);
    canvas.drawText(text, start, end, x + mSize / 2, y, paint);
  }
}

 

TextView textView = findViewById(R.id.text_view);
String text = "A";
SpannableString spannableString = new SpannableString(text);
SquareBackgroundSpan span = new SquareBackgroundSpan(50, Color.RED);
spannableString.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

 

Link to comment
Share on other sites

  • 0

Díky za tip, nicméně se zdá, že problém je ještě v něčem jiném. Když překlopím to tvoje řešení do toho svého, tak dosáhnu velice podobného výsledku Jako předtím:

 

                TextView sentenceTV = gsa.findViewById(R.id.sentenceTV);
                SpannableStringBuilder builder = new SpannableStringBuilder();
                for(int i = 0; i < currentSentence.length();i++){

                    try {
                        String letter = currentSentence.getString(i);
                        SpannableString letterSpannable = new SpannableString(letter);
                        SquareBackgroundSpan span = new SquareBackgroundSpan(50, Color.RED);
                        letterSpannable.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                        builder.append(letterSpannable);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
                sentenceTV.setText(builder, TextView.BufferType.SPANNABLE);

S tím, že když nepoužiji ten setSpan, tak se zase normálně zobrazí plaintext, nicméně když ho použiji, tak se tentokrát nezobrazí vůbec nic :oops:

Link to comment
Share on other sites

  • 0

Tak nakonec se mi to podařilo rozběhat. Vyhodil jsem ten SpannableStringBuilder a připojuju to postupně přímo k tomu TextView a už to funguje :) Díky moc ;) 

Link to comment
Share on other sites

  • 0

Tak ještě pro případ, že by to někdo taky řešil, dodám, že se tohle řešení chová velice nedeterministicky v případech, kdy označeným znakem je mezera. Testoval jsem to i tak, že jsem přesně ten samý string renderoval několikrát po sobě, a vždy z toho vypadlo něco jiného. Řešením je orámované mezery nahradit za jiný UTF neviditelný znak. Já například použil prázdný symbol pro brailovo písmo, ale předpokládám, že jakýkoliv jiný by fungoval taky.

  • Haha! 1
Link to comment
Share on other sites

  • 0
  • Globální moderátor
před 21hodinami, jenkings said:

Tak ještě pro případ, že by to někdo taky řešil, dodám, že se tohle řešení chová velice nedeterministicky v případech, kdy označeným znakem je mezera. Testoval jsem to i tak, že jsem přesně ten samý string renderoval několikrát po sobě, a vždy z toho vypadlo něco jiného. Řešením je orámované mezery nahradit za jiný UTF neviditelný znak. Já například použil prázdný symbol pro brailovo písmo, ale předpokládám, že jakýkoliv jiný by fungoval taky.

to zní jako něco co využívá vykreslovací engine internet explorer... Outlook, kterej to využívá, měl stejný problémy pro html mailový šablony

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...