Podejmowałam się nerwów, przyznaję. Lubię kod TextViews
, który wygląda jak TextViews
w kodzie, a nawet jeśli używam WebView
jako środka do uzyskania wyrównania tekstu wyrównanego: nie chcę na to patrzeć w ten sposób.
Utworzono niestandardowy widok (brzydki, prawdopodobnie zły), który implementuje metody, które zwykle używam z TextView
i modyfikuje zawartość WebView, aby odzwierciedlić te zmiany. Wszystko, co jest przydatne dla kogoś innego lub potencjalne zagrożenie Naprawdę nie wiem, dla mnie działa, użyłem go w kilku projektach i nie napotkaliśmy żadnych problemów. Jedyną drobną niedogodnością jest to, że zakładam, że jest to większa pamięć, ale nie ma się czym martwić, jeśli to tylko jeden lub dwa (popraw mnie, jeśli się mylę).
Wynik jest następujący:

a kod na ustawienie go programowo jest tak proste, jak to:
JustifiedTextView J = new JustifiedTextView();
J.setText("insert your text here");
Oczywiście byłoby głupie, aby pozostawić go jak tak więc dodałem również metody zmiany rozmiaru czcionki i koloru czcionki, które są w zasadzie wszystkim, do czego używam TextView. Czyli mogę zrobić coś takiego:
JustifiedTextView J = new JustifiedTextView();
J.setText("insert your text here");
J.setTextColor(Color.RED);
J.setTextSize(30);
i uzyskać następujący wynik (obrazy są przycinane):

Ale nie jest to, aby pokazać nam, jak to wygląda, to do podziel się tym, jak to zrobiłeś!
Wiem, wiem. Oto pełny kod. Dotyczy także problemów podczas ustawiania przezroczystego tła i ładowania łańcuchów znaków UTF-8 do widoku. Zobacz komentarze w reloadData(), aby poznać szczegóły.
public class JustifiedTextView extends WebView{
private String core = "<html><body style='text-align:justify;color:rgba(%s);font-size:%dpx;margin: 0px 0px 0px 0px;'>%s</body></html>";
private String textColor = "0,0,0,255";
private String text = "";
private int textSize = 12;
private int backgroundColor=Color.TRANSPARENT;
public JustifiedTextView(Context context, AttributeSet attrs) {
super(context, attrs);
this.setWebChromeClient(new WebChromeClient(){});
}
public void setText(String s){
this.text = s;
reloadData();
}
@SuppressLint("NewApi")
private void reloadData(){
// loadData(...) has a bug showing utf-8 correctly. That's why we need to set it first.
this.getSettings().setDefaultTextEncodingName("utf-8");
this.loadData(String.format(core,textColor,textSize,text), "text/html","utf-8");
// set WebView's background color *after* data was loaded.
super.setBackgroundColor(backgroundColor);
// Hardware rendering breaks background color to work as expected.
// Need to use software renderer in that case.
if(android.os.Build.VERSION.SDK_INT >= 11)
this.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
}
public void setTextColor(int hex){
String h = Integer.toHexString(hex);
int a = Integer.parseInt(h.substring(0, 2),16);
int r = Integer.parseInt(h.substring(2, 4),16);
int g = Integer.parseInt(h.substring(4, 6),16);
int b = Integer.parseInt(h.substring(6, 8),16);
textColor = String.format("%d,%d,%d,%d", r, g, b, a);
reloadData();
}
public void setBackgroundColor(int hex){
backgroundColor = hex;
reloadData();
}
public void setTextSize(int textSize){
this.textSize = textSize;
reloadData();
}
}
Jeśli użyjemy tekst WebView wziąć trochę czasu, aby wyświetlić. W moim przypadku obraz tła jest wyświetlany jako pierwszy i po 2 sekundach wyświetlania tekstu. Jak pokonać ten problem? –
i czy można ustawić czcionkę w widoku tekstowym? dzięki – Igor
To jest dobre rozwiązanie dla widoków, które nie będą wymagały użycia pamięci, na przykład nie jest to dobry pomysł przy użyciu widoku sieciowego (to) wewnątrz listview będzie zużywać dużo pamięci i Twoja aplikacja będzie reagować trochę wolniej niż przy użyciu widoku tekstowego. – superUser