PrintManager.print () и измененная локаль в attachBaseContext - PullRequest
0 голосов
/ 12 февраля 2019

Я использую это расширение, чтобы изменить язык моего приложения:

fun Context.changeLanguage(language: String): ContextWrapper {
    var context = this
    val config = context.resources.configuration

    if (language.isNotBlank()) {
        val locale = Locale(language)
        Locale.setDefault(locale)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            config.setLocale(locale)
        } else {
            config.locale = locale
        }
        context = context.createConfigurationContext(config)
    }
    return ContextWrapper(context)
}

MainActivity:

override fun attachBaseContext(newBase: Context?) {
        super.attachBaseContext(newBase?.changeLanguage(prefs.language))
}

Это прекрасно работает для всего, кроме печати.Когда я пытаюсь распечатать, я получаю java.lang.IllegalStateException: Can print only from an activity

PrintFragment в другом модуле:

activity?.also { context ->
    val printManager = context.getSystemService(Context.PRINT_SERVICE) as PrintManager
    val jobName = getString(R.string.print_document)
    printManager.print(jobName, PrintPdfAdapter(context, printList), null)
}

Есть идеи, как обойти эту проблему?

Я переключился обратно наcontext.resources.updateConfiguration(config, context.resources.displayMetrics) на данный момент.Надеюсь, они не удалят его слишком рано.

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете сохранить исходный контекст из fun attachBaseContext(newBase: Context?) в некоторую переменную MainActivity, а затем в вашей PrintFragment использовать эту переменную для печати.

То же, что и здесь: Android N: PrintManager.print () приводит к java.lang.IllegalStateException: может печатать только из действия

...