36

Вопрос по r.java-file, android-resources, architecture, android – undefined

В Android R.java используется для предоставления доступа к ресурсам, определенным в файлах XML. Для доступа к ресурсу нам нужно вызватьfindViewById() метод, передающий идентификатор ресурса для извлечения.

Это похоже на Spring, где бины определяются в контексте XML и выбираются с использованием контекста приложения.context.getBean("beanId")

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

Это меня смутило. Хотя то, что Android выглядит похожим на весну, какое преимущество он предлагает?

  1. What is the point of having an intermediate R.java anyway? Couldn't we just acquire resources directly from XML by use of a resource reader/application context. e.g. findViewById("resourceId")
  2. There isn't any loose coupling. Since references in R.java get auto-generated how could one delete a resource and put in a new one?
  3. What design pattern does it follow(if there is one)?
  4. Wouldn't it be better to have resources injected using IOC (like Roboguice)? Why did then google decide to give us such a wierd way of working with resources?

Прошу прощения за мое невежество. Я новичок в Java-разработчике, пробуя слишком много вещей одновременно. :-) Спасибо всем за отзывы.

  • Error: User Rate Limit Exceeded

    от Monika Michael
  • Error: User Rate Limit ExceededHelp CenterError: User Rate Limit Exceeded

    от
  • Я хочу просто перефразировать ваш вопрос дважды, это очень интересный вопрос

    от fatiDev
  • 0

    Он также содержит доступ к ресурсам - таким как id

    drawables, макеты, строки, массивы, и в основном все, что вы можете объявить в ресурсах.

  • 19

    android.R.java 

    не только гдеXML идентификаторы хранятся. Он также содержит доступ к ресурсам - таким как рисованные объекты, макеты, строки, массивы, и в основном все, что вы можете объявить в ресурсах.

    Лично я считаю, что это полезно при использовании Eclipse. Я могу просто напечататьfindViewById(R.id. и Eclipse покажет всплывающую подсказку со списком вариантов на выбор.

    Однако на уровне платформы я бы сказал, что жестко закодированные переменные id помогают предотвратить ошибки при использовании Strings для идентификации ресурсов - то, что можно отлаживать во время программирования (или во время компиляции, а не во время выполнения).

  • 21

    Самое большое преимущество заключается в локализации и предоставлении

    альтернативных ресурсов для экранов разных размеров.

    например, вы можете иметь ресурс StringR.string.myname это может быть определено на английском языке в/values-en/strings.xml и на испанском языке в/values-es/strings.xml

    Система позаботится или подберет нужный файл в зависимости от локали, которую вам просто нужно использовать@string/myname в вашем файле макета илиR.string.myname в вашем коде.

    Точно так же вы можете иметь два файла макета для портрета и ландшафта, определенных в

    res/layout/mylayout.xml
    res/layout-land/mylayout.xml
    

    В вашем коде вы просто укажите R.layout.mylayout для раздувания макета. Менеджер ресурсов подхватывает файл в layout-land, если устройство находится в ландшафтном режиме.

    Делать это вручную было бы кошмаром - отсюда необходимость в R файле

  • 1

    Сравнение чувствуетsomewhat a little bit (actually) 

    странно, потому что вы сравниваете два механизма, основанные на том, что они используютnamed things для того, чтобы делать вещи. Для загрузки ресурсов, например, посмотрите, как выполняется обработка ресурсов в.Net Мир.

    Это предусматриваетcompile-time проверка доступности ресурса. Потому что, если это не так, внутри не будет статикиR.java это указывает на это. В примере с Spring, как вы можете быть уверены, что есть бин с именемbeanId? Он не предусматривает проверку правильностиtype ресурса, хотя.

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

    Шаблон дизайна? Никто. Это просто добавляет один уровень косвенности, называя ресурсы и затем ссылаясь на нихonly by name, а не путем прямой загрузки их из их истинного местоположения.

    На самом деле, ресурсыare вводится, потому что загрузка ресурса должна справляться с локализацией. УвидетьВот за то, как Android делает вещи; в.Net мир, дополнительные культуры упакованы в спутниковые сборки;менеджер ресурсов загрузит правильный, основанный на текущей культуре.