Раздувание представления с помощью пользовательской локали в Android - PullRequest
0 голосов
/ 04 мая 2018

Я использую LayoutInflater для раздувания пользовательского макета, чтобы генерировать счета и квитанции в виде растровых изображений, затем я отправляю их на принтер или экспортирую в виде файлов png, например:

LayoutInflater inflater = LayoutInflater.from(getContext());
View view = inflater.inflate(R.layout.layout_invoice, null);
// Populate the view here...

int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(paperWidth, View.MeasureSpec.EXACTLY);
int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(widthMeasureSpec, heightMeasureSpec);

int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();

view.layout(0, 0, width, height);

Bitmap reVal = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(reVal);
view.draw(canvas);

Теперь этот код работает отлично, но он раздувает представление на текущем языке устройства. Иногда мне нужно генерировать счета на другом языке. Можно ли как-то раздуть это представление в пользовательской локали?

Примечание. Я пытался изменить локаль перед тем, как надувать представление, а затем сбросить ее:

Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = new Locale("fr");
// Inflate the view
// ...
// Reset the locale to the original value

Но по какой-то причине это не работает. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете создать локализованный контекст с помощью этого простого класса

public class LocalizedContextWrapper extends ContextWrapper {

    public LocalizedContextWrapper(Context base) {
        super(base);
    }

    public static ContextWrapper wrap(Context context, Locale locale) {
        Configuration configuration = context.getResources().getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLocale(locale);
            context = context.createConfigurationContext(configuration);
        } else {
            configuration.locale = locale;
            context.getResources().updateConfiguration(
                    configuration,
                    context.getResources().getDisplayMetrics()
            );
        }

        return new LocalizedContextWrapper(context);
    }
}

И используйте это вот так

Context localizedContext = LocalizedContextWrapper.wrap(context, locale);
0 голосов
/ 04 мая 2018

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

Configuration config = new Configuration(resources.getConfiguration());
Context customContext = context.createConfigurationContext(config);

Locale newLocale = new Locale("fr");
config.setLocale(newLocale);

LayoutInflater inflater = LayoutInflater.from(customContext);

(Извините, что спросил, прежде чем делать все, что мог).

...