2016-03-04 2 views
10

Я хотел бы интегрировать символ emoji в приложение для Android. Поэтому я посмотрел шестнадцатеричный код для символа UTF-8, и добавил следующее к моему string.xml файла:Символ Emoji в файле string.xml crashes app

<string name="thumbsup">Perfect <node>&#x1f44d;&#x1f44d;</node></string> 

Это должно привести к Perfect. Тем не менее, вместо того, чтобы мое приложение падает, когда активность вызова пытается отобразить это:

JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xf0 

Не особенно идеальный;)

+0

Я не знаю, формат 'string.xml' файла, но ваш пример не является допустимым XML. Ваш '' узел содержит некоторый текст и другой узел XML (''). Просто 'Perfect & # x1f44d; & # x1f44d;' поскольку значение может работать. –

+0

Привет, пожалуйста, обратитесь к этому 'http: // stackoverflow.com/questions/24852806/how-can-i-put-utf-16-characters-in-android-string-resource'. –

+1

@toom извините за неправильную ссылку - вот ссылка 'http://stackoverflow.com/questions/33288225/how-can-i-put-a-ora-any-other-emoji-insidea-an-xml- string' –

ответ

0

Похоже, что более новые версии Android не вызывают сбоев (API 24 работал в моих тестах), но это не помогает, если вы поддерживаете более старые версии. Лучшее, что я смог выяснить, это использовать строки, закодированные Java.

public class AppEmojiStrings { 

    // This is only a workaround for emoji causing crashes in XML strings. 
    // Use the standard strings.xml for all other strings. 

    public static final String thumbsUp = "Thumbs up "; 
    public static final String iLoveNY = "I \uD83D\uDC99 NY"; 
} 

Есть целый ряд недостатков этого метода, основной из которых является, что она не может быть доступна в файлах макета XML. Но это может быть жизнеспособным решением для некоторых ситуаций.

+0

Возможно, вы сможете использовать привязку данных, если вам это действительно нужно в XML –

+0

@ cricket_007, я мало что сделал с [привязкой данных Android] (https://developer.android.com/topic/libraries/data-binding/index.html). Я также задаюсь вопросом, могут ли работать [форматированные строки] (https://stackoverflow.com/questions/3656371/dynamic-string-using-string-xml/40715374#40715374). Если это работает для всех, оставьте комментарий. – Suragch

2

Исправление что: Добавить «--utf16» в AAPT путем добавления

android { 
    aaptOptions { 
     additionalParameters '--utf16' 
    } 
} 

в файл build.gradle, и убедитесь, что вы не используете aapt2.

См https://issuetracker.google.com/issues/37140916

+0

он работает, спасибо –