Хранение и инициализация универсально используемых значений для Android-приложения (пример: плотность экрана) - PullRequest
0 голосов
/ 03 января 2019

Я довольно новичок в программировании для Android, так что, если это все равно неправильный путь, не стесняйтесь комментировать мою плохую практику.

В моем приложении у меня есть различные виды деятельности, которые используют одинаковыеценности.Кроме того, у меня есть некоторые классы, которые имеют статические методы, используемые в нескольких действиях.Например, чтобы генерировать ImageViews из «URL».

Одним из значений, которое я бы использовал почти во всех своих приложениях, является этот фрагмент: (взят из другого вопроса по SO )

getApplicationContext().getResources().getDisplayMetrics().density

Это конкретное значение дляПример необходим для каждого вида деятельности.Но это также необходимо для той же задачи.Поэтому я использую статический класс, который имеет соответствующий метод для этой задачи.Однако у этого статического класса нет «getApplicatioContext», очевидно.Поэтому мне нужно было бы сохранить значение где-нибудь еще.

Мой вопрос , есть ли определенный или хотя бы оптимальный или чистый способ хранения таких значений и их инициализации при запуске приложения?

Насколько я понимаю, я мог бы использовать метод "onCreate" моего запуска и инициализировать некоторый статический класс или что-то в этом роде.Однако, это кажется мне немного грязным.Может быть, есть какое-то «более раннее» время, чем onCreate () для актива запуска, и более подходящее место для хранения значений, чем у специального статического (или синглтонного) класса?

1 Ответ

0 голосов
/ 03 января 2019

Трудно сказать вам точно, что такое лучшая практика, когда мы не знаем точно, чего вы пытаетесь достичь в целом, но у меня есть точка зрения, которая, на мой взгляд, достаточно абстрактна, чтобы иметь отношение к делу *. 1001 *

Всегда использовать текущий Context. Не храните Context или иным образом не пытайтесь "обойти" необходимость передавать аргумент Context в методы.

(Конечно, всегда есть исключения, но это хорошее эмпирическое правило.)

В этом конкретном случае я бы рекомендовал создать класс с помощью статического вспомогательного метода:

public class MyUtils {

    private MyUtils() {
        throw new UnsupportedOperationException("static methods only");
    }

    public static float getDisplayDensity(Context context) {
        return context.getResources().getDisplayMetrics().density;
    }
}

И вы можете позвонить с любого Activity, например:

float density = MyUtils.getDisplayDensity(this);

Или из любого Fragment или View, например:

float density = MyUtils.getDisplayDensity(getContext());

Часто, когда люди пишут вопросы о DisplayMetrics и плотности, они действительно пытаются конвертировать dp единицы в px единицы. Например, они знают, что хотят, чтобы что-то было 48dp, но им нужно передать значение пикселя в некоторый метод Android, поэтому они хотят умножить на плотность отображения.

В этих случаях вам лучше использовать ресурсы dimen. Вы можете определить:

<dimen name="my_dimension">48dp</dimen>

И тогда вы можете легко получить это в px единицах, позвонив

getResources().getDimensionPixelSize(R.dimen.my_dimension);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...