Отключение приложения или масштабирования активности, если Настройки -> Дисплей -> Размер дисплея изменен на Большой или маленький

В моем приложении я не хочу, чтобы его размер изменился из-за проблем с дизайном.

Я пробовал с 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)
Другие вопросы по тегам