Как избежать плохой практики сохранения целочисленных ресурсов (R.drawable.resource) - PullRequest
0 голосов
/ 14 октября 2019

Имея класс, который ссылается на значение ресурса для String и drawable, мне нужно сохранить этот класс и загрузить его в будущем. Я сохраняю это с помощью GSON и общих предпочтений.

Проблема в том, что я всегда делаю изменения в ресурсе моего приложения, идентификатор ресурса постоянных значений больше не действителен, потому что идентификаторы ресурсов всех ресурсовв приложении изменения.

Как можно избежать этой проблемы? Мне нужно сохранить этот класс ..

Это минимальный пример кода класса, который я сохраняю:

public class SpaceshipUpdate {
    private int nameResource;
    private int imageResource;

    public SpaceshipUpdate(int nameResource, int imageResource){
        this.nameResource = nameResource;
        this.imageResource = imageResource;
    }
}

И как я создаю новый экземпляр этого класса:

SpaceshipUpdate u1 = new SpaceshipUpdate(R.string.laser1_title, R.drawable.shop_proton_laser);

спасибо

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вы можете сохранить имя ресурсов (например, «laser1_title») в виде строки вместо R.string.laser1_title версии и использовать эту вспомогательную функцию (или что-то подобное) для динамического получения этого ресурса.

Это может быть не так быстро, но если у вас мало ресурсов, вы не должны замечать проблем с производительностью.

public static int has_resource_id(Context context,String name,String resource_type)
{
    final int resourceId = context.getResources().getIdentifier(name, resource_type,
            context.getApplicationContext().getPackageName());
    return resourceId;
}
0 голосов
/ 15 октября 2019

Наконец, я выбрал это решение, вместо того, чтобы хранить идентификаторы ресурса, я создал методы в базовых классах, которые возвращают значение в зависимости от типа класса-потомка:

public int getName() {
    switch (type){
        case SPACESHIP_TYPE_1:
            return R.string.spaceship1;
        case SPACESHIP_TYPE_2:
            return R.string.spaceship2;
        case SPACESHIP_TYPE_3:
            return R.string.spaceship3;
        case SPACESHIP_TYPE_4:
            return R.string.spaceship4;
    }
    return -1;
}

В этом нет необходимостисохранить идентификаторы ресурса

...