Um zu prüfen, ob das Musiksymbol in in einer Zeichenfolge angezeigt wird (wenn es auf einigen Geräten nicht angezeigt wird), können Sie versuchen, Messen die String-Breite; if width == 0
, dann fehlt das Symbol.
Ich habe eine benutzerdefinierte Schriftart, die das Feldzeichen anzeigt. Die Schriftart, die ich verwende, unterstützt anscheinend nicht alle Sprachen. Ich möchte überprüfen, ob der String, den ich gerade anzeigen möchte, mit meiner benutzerdefinierten Schriftart angezeigt werden kann. Wenn es nicht möglich ist, dann möchte ich die Standard-Android-Schriftart verwenden (von der ich weiß, dass sie die Zeichen anzeigen kann). Ich kann keine Methode finden, um zu überprüfen, ob mein Typeface tatsächlich einen bestimmten String anzeigen kann. Ich bin sicher, ich habe eine Methode gesehen, die das irgendwo macht. Wer weiß?
Aktualisierung: Wenn Sie für die API-Stufe 23 oder höher codieren, verwenden Sie Paint. hasGlyph () wie in der Antwort von Orson Baines erwähnt. Ansonsten sehe meine ursprüngliche Antwort unten.
Wie Sie in Ihrer eigenen Antwort erwähnt haben, gibt es keine eingebauten Methoden, um dies zu überprüfen. Wenn Sie jedoch eine Kontrolle darüber haben, welche Zeichenfolge / Zeichen Sie überprüfen möchten, ist dies tatsächlich mit einem etwas kreativeren Ansatz möglich.
Sie könnten ein Zeichen, von dem Sie wissen, dass es fehlt, in die zu überprüfende Schriftart zeichnen und dann ein Zeichen zeichnen, von dem Sie wissen möchten, ob es existiert, und es dann vergleichen und sehen, ob es gleich aussieht.
>Hier ist ein Codebeispiel, das veranschaulicht, wie ich diese Überprüfung implementiert habe:
%Vor%Es gibt einige wichtige Einschränkungen, die Sie bei dieser Methode beachten sollten:
isCharacterMissing
) darf kein Leerzeichen sein (kann mit Zeichen.isWhitespace () ). In einigen Schriftarten werden fehlende Zeichen als Leerzeichen dargestellt. Wenn Sie also ein vorhandenes Leerzeichen vergleichen, wird es in Fonts wie diesen fälschlicherweise als fehlendes Zeichen angezeigt. missingCharacter
-Member muss ein Zeichen sein, von dem bekannt ist, dass es in der zu überprüfenden Schriftart fehlt. Der Codepunkt U + 0978 , den ich verwende, ist ein reservierter Codepunkt in der Mitte des Devanagari-Unicode-Blocks, so dass es derzeit in allen Unicode-kompatiblen Zeichensätzen fehlen sollte. Wenn in Zukunft jedoch neue Zeichen zu Unicode hinzugefügt werden, könnte dieser Codepunkt einem echten Zeichen zugewiesen werden. Dieser Ansatz ist also nicht zukunftssicher, aber wenn Sie die Schriftart selbst angeben, können Sie sicherstellen, dass Sie immer dann ein fehlendes Zeichen verwenden, wenn Sie die Schriftart Ihrer Anwendung ändern. Aktualisierung:
Die Lösung, U + 0978 zu betrachten, funktionierte nicht so lange, wie von anderen darauf hingewiesen wurde. Dieses Zeichen wurde in der Unicode 7.0 Version in Juni 2014 . Eine weitere Option ist die Verwendung eines Glyphs, das in Unicode vorhanden ist, aber sehr unwahrscheinlich in einer normalen Schriftart verwendet wird.
U + 124AB im Frühe Dynastische Keilschrift Block ist wahrscheinlich etwas, das in vielen Schriftarten überhaupt nicht existiert.
@nibarius Antwort funktioniert gut, wenn auch mit einem anderen Charakter: "\ u2936".
Diese Lösung ist jedoch schwer in Speicher, CPU und Zeit. Ich brauchte eine Lösung für eine sehr kleine Anzahl von Zeichen, also habe ich implementiert eine "schnelle und schmutzige" Lösung, indem nur die Grenzen überprüft werden. Es funktioniert ungefähr 50 mal schneller, also ist es für meinen Fall besser geeignet:
%Vor%Ich sollte warnen, dass diese Methode weniger genau ist als @nibarius, und es gibt einige falsche Negative und falsche Positive, aber wenn Sie nur ein paar Zeichen testen müssen, um auf andere Charaktere zurückgreifen zu können - diese Lösung ist großartig.
Überprüfen Sie den Quellcode von Googles Mozc Projekt. Die EmojiRenderableChecker-Klasse scheint ziemlich gut zu funktionieren!
Es ist wie eine Kompat-Version für Paint.hasGlyph (Hinzugefügt in Marshmallow).
Wenn Sie möchten, dass Ihre App weiterhin mit APIs unter 23 kompatibel ist und die hasGlyph-Funktion in Ihrem Code weiterhin verwendet, können Sie @TargetApi (23) folgendermaßen verwenden:
%Vor%Und dann in Ihrem Code:
%Vor%Das einzige Problem besteht darin, dass in APIs unter 23 möglicherweise leere Symbole angezeigt werden. Aber zumindest in API23 + wird deine App perfekt sein.
Tags und Links android custom-font typeface