Отключение приложения или масштабирования активности, если Настройки -> Дисплей -> Размер дисплея изменен на Большой или маленький
В моем приложении я не хочу, чтобы его размер изменился из-за проблем с дизайном.
Я пробовал с android:resizeableActivity="false"
в теге приложения и теге активности запуска, но это не помогло.
2 ответа
Я нашел решение для этого.
Если системный размер текста изменился или для параметра "Размер экрана" задано значение "Большой" (выше Android Oreo), ваше приложение будет работать как обычно (без большого текста и увеличенных изображений) с кодом ниже:
Configuration configuration = getResources().getConfiguration();
configuration.fontScale = (float) 1; //0.85 small size, 1 normal size, 1,15 big etc
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.fontScale * metrics.density;
configuration.densityDpi = (int) getResources().getDisplayMetrics().xdpi;
getBaseContext().getResources().updateConfiguration(configuration, metrics);
Я предполагаю, что вы пытаетесь получить отображение, которое не меняется, если пользователь изменяет параметры доступа на своем телефоне в зависимости от размера пользовательского интерфейса.
Вы можете получить это с помощью DisplayMetrics.
DisplayMetrics metrics = getResources().getDisplayMetrics();
С "нормальными" значениями масштабного коэффициента metrics.xdpi
а также metrics.densityDpi
имеют одинаковое значение. Если это не так, вы можете получить "реальный" масштабный коэффициент, который используется, когда пользователь использует нормальное масштабирование, используя следующее.
if(metrics.xdpi != metrics.densityDpi){
Log.d(TAG,"Real scale " + (metrics.xdpi / metrics.densityDpi)*metrics.density);
}
Чем вы можете использовать указанное значение, чтобы умножить ваши фиксированные значения из макета, чтобы оно могло иметь точную плотность на разных экранах. Это также будет означать, что каждое значение в макете должно использовать px
вместо dp
или же sp
,
Хотя этот подход будет работать, я настоятельно рекомендую не использовать его.
Во-первых, потому что это много работы, и будет сложно поддерживать этот код в будущих обновлениях.
Во-вторых, эта функция Android очень удобна, и если ваше приложение не компилирует ее, это, вероятно, указывает на то, что вы должны лучше создать свой макет.
Ответ здесь верен лишь отчасти, так как xdpi и densityDPI совпадают только в эмуляторах, xdpi различается для всех телефонов, а densitydpi одинакова, поэтому было бы разумнее сделать это:
val configuration = getResources().getConfiguration()
val metrics = getResources().getDisplayMetrics()
Log.d("TAG", metrics.toString() + " " + getResources().getConfiguration())
when (resources.displayMetrics.xdpi) { //change size to ignore display size
in 1..120 -> {
configuration.densityDpi = 120
}
in 121..160 -> {
configuration.densityDpi = 160
}
in 161..240 -> {
configuration.densityDpi = 240
}
in 241..320 -> {
configuration.densityDpi = 320
}
in 321..480 -> {
configuration.densityDpi = 480
}
in 481..640 -> {
configuration.densityDpi = 640
}
}
getBaseContext().getResources().updateConfiguration(configuration, metrics)