Come posso get l'attributo fgcolor per funzionare sulle versioni Android più recenti?

Ho usato per fare questo:

<string name="foo">white <font fgcolor="#ff6890a5">blue</font></string> 

Ma ora non funziona più. Sembra essere un bug nel codice integer di parsing; vedere https://code.google.com/p/android/issues/detail?id=58192

  • Errore durante l'esecuzione di zipalign
  • setRotation (90) per scattare foto in modalità ritratto non funziona su dispositivi samsung
  • Come creare applicazioni di sistema in android
  • ViewPager rileva quando l'utente sta cercando di scoraggiare i limiti
  • C'è un modo per salvare saldamente dati utente su un dispositivo Android?
  • come mostrare android tabella di gruppo?
  • Il problema è che stiamo ricevendo i reclami dei clienti adesso ; Non vedo l'ora che il bug venga fissato.

    Qualcuno sa un lavoro in giro, ad esempio utilizzando risorse nominate da color.xml o qualcosa di simile?

    ETA: Ho scoperto che fgcolor="blue" funziona ancora, ma è l'ombra sbagliata di azure. C'è un elenco di nomi di colore legali da qualche parte? Forse potrei trovare uno che è abbastanza vicino. Funziona anche se il colore è un numero senza il set di bit elevato, come #7f6890a5 , ma ovviamente è troppo debole per essere utile; Ho bisogno di un colore solido, non semitrasparente.

    ETA: il codice sorgente di navigazione mostra questi colors:

      aqua 0x00FFFF black 0x000000 blue 0x0000FF fuchsia 0xFF00FF green 0x008000 grey 0x808080 lime 0x00FF00 maroon 0x800000 navy 0x000080 olive 0x808000 purple 0x800080 red 0xFF0000 silver 0xC0C0C0 teal 0x008080 white 0xFFFFFF yellow 0xFFFF00 

    Questo non risolve il mio problema, ma forse altre persone che cercano questa domanda potrebbero trovare queste informazioni utili.

  • Imansible accendere la posizione su android api23?
  • Come registrare lo schermo Android con Android Studio?
  • ACRA con android: come eseguire il codice prima che si verifichi un incidente
  • Come utilizzare l'account Gmail per autenticare l'applicazione in android?
  • intent.getStringExtra () restituisce null ma String! = null è vero? android
  • PhoneGap (3.4.0) app android con sqlite, funziona bene in emulatore, ma non in dispositivo
  • 3 Solutions collect form web for “Come posso get l'attributo fgcolor per funzionare sulle versioni Android più recenti?”

    Come possiamo sfruttare il fatto che i colors senza l'alto set di bit funzionano e sostituirli solo con i colors corretti? Quindi puoi avere un metodo come questo:

     private CharSequence fixSpanColor(CharSequence text) { if (text instanceof Spanned) { final SpannableString s = new SpannableString(text); final ForegroundColorSpan[] spans = s.getSpans(0, s.length(), ForegroundColorSpan.class); for (final ForegroundColorSpan oldSpan : spans) { final ForegroundColorSpan newSpan = new ForegroundColorSpan(oldSpan.getForegroundColor() | 0xFF000000); s.setSpan(newSpan, s.getSpanStart(oldSpan), s.getSpanEnd(oldSpan), s.getSpanFlags(oldSpan)); s.removeSpan(oldSpan); } return s; } else { return text; } } 

    Dovnetworking quindi passare qualsiasi text con l'accento di colore richiesto attraverso questo metodo, l'esempio più semplice sarebbe modificare tutte le chiamate come questa:

     tv.setText(getText(R.string.foo)); 

    A:

     tv.setText(fixSpanColor(getText(R.string.foo))); 

    Speriamo che, a seconda del modo in cui il tuo codice è strutturato, potrebbe esistere già un posto centrale where puoi aggiungere questa chiamata di metodo extra.

    Ho una soluzione solida nel mio codice client per reimpostare manualmente i ForegroundColorSpans al colore corretto, ma sarebbe bello non farlo.

    Penso che la soluzione che il giornalist del problema sta parlando è il seguente:

    Definire la string come:

     <string name="foo">white blue</string> 

    Nella tua attività:

     TextView tv = (TextView) findViewById(R.id.textView1); SpannableString spannableString = new SpannableString(getResources().getString(R.string.foo)); ForegroundColorSpan fcs = new ForegroundColorSpan(getResources().getColor(R.color.bluish)); spannableString.setSpan(fcs, spannableString.toString().indexOf(" ") + 1, spannableString.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); tv.setText(spannableString); 

    R.color.bluish è definito come <color name="bluish">#ff6890a5</color> .

    Tuttavia, utilizzando lo spazio per distinguere e applicare il ForegroundColorSpan sarebbe solo pratico se si dispone di un numero limitato di stringhe definite.


    La seguente modifica potrebbe essere più facile per eseguire:

    Definire la string come:

     <string name="foo_sep_1"><![CDATA[white <font color=\"#6890a5\">blue</font>]]></string> 

    O:

     <string name="foo_sep_1">white &lt;font color="#6890a5"&gt;blue&lt;/font&gt;</string> 

    Nella tua attività:

     TextView tv2 = (TextView) findViewById(R.id.textView2); tv2.setText(Html.fromHtml(getResources().getString(R.string.foo_sep_1))); 

    Fare attenzione al codice a colors: i codici a colors HTML non hanno valori alpha ( RRGGBB functionrà, AARRGGBB non funziona)


    Un'altra soluzione è usando direttamente Html.fromHtml(String) :

     TextView tv3 = (TextView) findViewById(R.id.textView3); tv3.setText(Html.fromHtml("white <font color='#6890a5'>blue</font>")); 

    Kudos a TWiStErRob che ha trovato una soluzione che non coinvolge codice in https://stackoverflow.com/a/11577658/338479 . Per citare:

    per qualsiasi colore sopra 7fffffff applicare il seguente: <fonte font = "# ff6890a5"> metta ff6890a5 in una calcolatrice (facoltativamente convertire in decimale innanzitutto) e flip il segno, quindi (convertire eventualmente in esadecimale) prendere le ultime 8 cifre esadecimali utilizzare <font color = "- # 00976F5B">.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.