Я разрабатываю приложение с React Native для iOS и Android и пытаюсь предотвратить масштабирование дисплея в приложении для конкретного устройства.
Для масштабирования размера текста / шрифта размещение следующего кода в файле App.js корневого уровня решает проблему как для iOS, так и для Android:
if (Text.defaultProps == null) {
Text.defaultProps = {};
}
Text.defaultProps.allowFontScaling = false;
Однако устройства Android имеют следующую настройку размера экрана, которая все еще применяется:
Я пытался (безуспешно) собрать воедино различные «решения» этой проблемы, которые я нашел в ответах на следующие вопросы:
Изменение размера системного дисплея программно Android N
Отключение приложения или масштабирования активности, если Настройка -> Дисплей -> Размер дисплея изменен на Большой или маленький
как предотвратить эффекты изменения размера шрифта системы для приложения Android?
Я часто встречал ссылки на класс BaseActivity
, который расширяет класс Activity
. Насколько я понимаю, именно внутри этого класса я буду писать метод (давайте назовем его adjustDisplayScale
) для внесения изменений в Configuration
из Context
, которые я получаю из Resources
, и что тогда я будет вызывать adjustDisplayScale
в методе onCreate()
после super.onCreate()
в файле MainApplication.java
.
На данный момент в этом каталоге у меня есть только два файла - MainApplication.java
и MainActivity.java
.
Я попытался создать новый модуль и связанный с ним файл пакета для реализации adjustDisplayScale
, следуя этим инструкциям, и он не работал:
https://facebook.github.io/react-native/docs/text.html
Я попытался поместить реализацию adjustDisplayScale
в onCreate()
следующим образом, и это не сработало:
@Override
public void onCreate() {
super.onCreate();
Context context = getApplicationContext();
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
configuration.fontScale = 1f;
DisplayMetrics metrics = res.getDisplayMetrics();
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = 1f;
configuration.densityDpi = (int) res.getDisplayMetrics().xdpi;
context = context.createConfigurationContext(configuration);
SoLoader.init(this, /* native exopackage */ false);
}
Потенциально многообещающий ответ включал следующее:
protected override void AttachBaseContext(Context @base) {
var configuration = new Configuration(@base.Resources.Configuration);
configuration.FontScale = 1f;
var config = Application.Context.CreateConfigurationContext(configuration);
base.AttachBaseContext(config);
}
Но когда я попытался использовать это, я получил ошибки из-за того, что не распознал символ @ base.
Немного предыстории ... Я выполнил 99% своей работы над этим проектом в JavaScript / React Native и почти не разбираюсь в таких вещах, как Resources
, Context
, Configuration
и DisplayMetrics
связан с разработкой Android И последний раз, когда я писал код на Java, было 10 лет назад. Я потратил несколько мучительных часов, пытаясь понять это, и любая помощь будет очень оценена.
пс. Мне хорошо известно, что настройки доступности существуют по уважительной причине, поэтому, пожалуйста, избавьте меня от диатрибы, которую я видел во многих «ответах» о том, почему мне нужно исправить свой пользовательский интерфейс, чтобы работать с настройками доступности, а не отключать их.