Мое приложение падает на setContentView на OnCreate только на низкой API

Манипуляции с символами в String не очень просты. Вам нужно следующее:

Swift 2.1

let s = "05554446677"
let s2 = String(format: "%@ (%@) %@ %@ %@", s.substringToIndex(s.startIndex.advancedBy(1)),
    s.substringWithRange(s.startIndex.advancedBy(1) ... s.startIndex.advancedBy(3)),
    s.substringWithRange(s.startIndex.advancedBy(4) ... s.startIndex.advancedBy(6)),
    s.substringWithRange(s.startIndex.advancedBy(7) ... s.startIndex.advancedBy(8)),
    s.substringWithRange(s.startIndex.advancedBy(9) ... s.startIndex.advancedBy(10))
)

Swift 2.0

let s = "05554446677"
let s2 = String(format: "%@ (%@) %@ %@ %@", s.substringToIndex(advance(s.startIndex, 1)),
    s.substringWithRange(advance(s.startIndex, 1) ... advance(s.startIndex, 3)),
    s.substringWithRange(advance(s.startIndex, 4) ... advance(s.startIndex, 6)),
    s.substringWithRange(advance(s.startIndex, 7) ... advance(s.startIndex, 8)),
    s.substringWithRange(advance(s.startIndex, 9) ... advance(s.startIndex, 10))
)

Код будет печатать 0 (555) 444 66 77

0
задан Idan Zimbler 16 January 2019 в 01:08
поделиться

1 ответ

Похоже, что трассировка стека указывает на проблему с чтением текущей Конфигурации ресурсов (независимо от того, является ли язык локали RTL или нет).

Глядя на код активности, вы изменяете локаль, используемую вашим приложением, вместо использования локали телефона, которая могла бы объяснить проблему. Ваша активность на самом деле пройдёт onCreate дважды. Первый раз, вероятно, надувает ваше представление XML без каких-либо проблем, но как только вы установите новую конфигурацию (вызвав loadLocale()), действие будет уничтожено и воссоздано, что выполнит onCreate() во второй раз с вашей новой конфигурацией , Это когда ваше приложение падает.

По моему мнению, проблема, скорее всего, заключается в методе setLocale(), изменение конфигурации выполнено неправильно, и новые API могут использовать значение по умолчанию, тогда как старые API просто аварийно завершают работу.

Несмотря на то, что я бы не рекомендовал изменять Locale в приложении, здесь есть дополнительная информация о его изменении в приложении Android:
https://proandroiddev.com/change-language- programmatic-at-runtime-on-android-5e6bc15c758

В зависимости от поддерживаемой версии API вы можете использовать разные методы.

Метод, который он использует для изменения конфигурации, выглядит следующим образом:

    private static Context updateResources(Context context, Locale locale) {
        Locale.setDefault(locale);

        Resources res = context.getResources();
        Configuration config = new Configuration(res.getConfiguration());
        if (Build.VERSION.SDK_INT >= 17) {
            config.setLocale(locale);
            context = context.createConfigurationContext(config);
        } else {
            config.locale = locale;
            res.updateConfiguration(config, res.getDisplayMetrics());
        }
        return context;
    }
0
ответ дан Julien Arzul 16 January 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: