Android динамически добавляет элемент в массив XML-ресурсов - PullRequest
5 голосов
/ 03 февраля 2012

Есть ли способ добавить элементы кода в ресурс String-Array? Например, если я хочу создать счетчик, который показывает пользовательские значения, и я хочу позволить пользователю добавлять свои собственные пользовательские значения.

Ответы [ 2 ]

7 голосов
/ 03 февраля 2012

Нет.это не поддерживается, потому что ресурсы упакованы в двоичный файл .apk и поэтому не могут быть изменены.

Не следуйте этой схеме проектирования, измените свой подход.

3 голосов
/ 18 марта 2018

вероятно JoxTraex не имеет представления о платформе Android или, как они говорят:

, когда кто-то говорит, что это не может быть сделано - всегда есть кто-то, кто этого не делаетзнаю, что и сделает это:)

так, к сути:

Resources - это открытый класс, являющийся просто оболочкой для класса ResourcesImpl

(с устаревшим конструктором - но доступен)

public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config)

в приложении каждый вызов выполняется через Context

, поэтому:

1) вы всегда можете предоставитьваша собственная реализация ресурсов

2) или (когда этого достаточно) ваша собственная реализация контекста (таким образом, небо - это предел)

... я теперь чувствую взгляд на "реализацию контекста" - да, выможет даже заменить самый верхний контекст в LoadedApk, Activity и т. д. да, круто?но когда, как?как: с помощью размышлений, когда: хороший дизайнер приложений знает, что это место, где (до) первый / любой вызов такого объекта сделан ...

Но здесь есть один опасный улов - в одном случае, Android пряморазверните Context в ContextImp, и тогда вам нужно будет вернуть этот Context вместо своего - где я буду хранить это в секрете для тех, кто любит загадки :)

также есть в ресурсах

a) скрытый конструктор (лучшая точка входа, поскольку он не создает ReourceImpl (который может быть установлен методом, упомянутым ниже)

public Resources(@Nullable ClassLoader classLoader) 

b) скрытый метод

setResImpl(ResourcesImpl) 

суммируем:

поэтому, вызвав

Resources.getStringArray(**not existing in APK resource id here**);

в нашей собственной реализации, мы можем получить то, что хотим :)

еще лучше мы можем добавить в нашу реализацию

addResourceById(int,Object)

метод и добавление новых ресурсов :) затем с проверкой назначенной способности ресурса мы будем использовать и повышать рейтинг нашей реализации :), чтобы использовать наш недавно добавленный метод :)

кстати: если кто-тоНе говорит вам: «не надо этого делать - блаблабла», это лучшая причина для этого!- если это не разрешено законом:)

достаточно, чтобы теория пошла на практику:

пример Реализация контекста перенаправляет вызовы getString:

    public class MyContext extends Context {
        ....
    // override context get resources method 
    @Override
    public android.content.res.Resources getResources() {
        // get super resources 
        android.content.res.Resources resources = super.getResources();
        // pull assets 
        android.content.res.AssetManager assets = resources.getAssets();
        // pull metrics 
        android.util.DisplayMetrics displayMetrics = resources.getDisplayMetrics();
        // pull configuration 
        android.content.res.Configuration configuration = resources.getConfiguration();
        // construct new anon resource implementation 
        return new android.content.res.Resources(assets, displayMetrics, configuration) {

            // overrride interesting method 
            @android.support.annotation.NonNull
            @Override
            public String getString(int id) throws android.content.res.Resources.NotFoundException {
                return id == pl.ceph3us.base.common.R.string.my_sweet_google
                    ? "fck_you_google";
                    : super.getString(id);
            }
        };
    }

}
...